2013-10-24 2 views
1

Предположим, у меня есть 4 класса: A, B, SA и SB где B extends A и SB extends SA.Динамический вызов конструктора в java?

Класс A имеет следующий конструктор:

private SA a; 
public A() { 
    a = new SA(); 
} 

Очевидно, когда я звоню застройщик для класса B и так B extends A конструктор класса A также называется. Но в таком случае я хотел бы построить конструктор A, чтобы сделать a = new SB(); вместо a = new SA();.

Есть ли простой способ сделать это без , изменяя общедоступные интерфейсы как A, так и B?

+1

Зависимость от инъекций! _ без изменения общедоступных интерфейсов как A, так и B_? На самом деле, нет. –

+0

@SotiriosDelimanolis хорошо, как бы вы могли изменить общедоступные интерфейсы 'A' или' B'? Каким будет самый простой способ (меньше изменений)? – insumity

+4

Создайте конструктор 'A', чтобы принять аргумент' SA'. –

ответ

5

Просто public конструктор и protected конструктор:

private SA a; 
public A() { 
    this(new SA()); 
} 
protected A(final SA a) { 
    this.a = a; 
} 

Затем в B:

public B() { 
    super(new SB()); 
} 
+0

Что делать, если 2 класса находятся в разных пакетах. Вы не могли бы сделать супер (новый SB()); '. поскольку 'A (final SA a)' защищен – insumity

+2

@foobar nope, вся точка 'protected' - это то, к чему можно получить доступ подклассами в другом пакете. Взгляните на [это] (http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html). –

+0

Да, правильно ... (пропустил это). Благодаря! – insumity

0

Да, это так. Например:

public A(YourEnum en) { 
    if (en == YourEnum.SA){ 
     a = new SA(); 
    } else { 
     a = new SB(); 
    } 
} 

Кроме того, в зависимости от того, что вам действительно нужно, это может быть сделано путем перегрузки конструкторами

public A(){ 
    a = new SA(); 
} 

public A(YourObjectYouNeed dataNeededForAnotherConstructor){ 
    //doing initialization stuff 
    a = new SB(); 
} 
+1

Это не выглядит особенно удобным. Что, если я теперь добавлю 'C', который расширяет' A', и я хочу, чтобы 'SC' прошел? Внезапно нарушается OCP. –

+1

Вы добавляете новую новую зависимость вместо ее удаления. –

Смежные вопросы