2015-12-28 1 views
-1

Рассмотрим этого псевдокодуКак создать экземпляр интерфейса набранного объекта в конструкторе?

public interface Interface {...} 
public class A implements Interface{...} 
public class B implements Interface{...} 

И теперь мы получили контейнер класса с полем типа интерфейса

public class Container{ 
Interface field; 
...} 

Как я сделать конструктор Контейнера при инстанцировании поля он вызывает правильный конструктор в зависимости от передается ли ему параметр A или B?

+1

Поле 'field' будет установлено по умолчанию, а интерфейсы не могут быть созданы. – Ramanlfc

+1

Вы не можете создать экземпляр интерфейса, вам нужно создать экземпляр класса, соответствующего этому протоколу – luk2302

+1

' B.class. newInstance() 'будет создавать экземпляр B, если у вас действительно есть класс B в качестве параметра. Тем не менее, все выглядит немного подозрительно, как дизайн. – pvg

ответ

1

Container не будет вызывать конструктор. Все, что создает Container, предоставит ему экземпляр класса A или B.

например.

public Container createContainer() { 
    final Interface myDependent = new A(); 
    return new Container(myDependent); 
} 

public class Container { 
    private Interface interface; 

    public Container(Interface interface) { 
     this.interface = interface; 
    } 
    ... 
} 

Одна из основных идей инъекции зависимостей является то, что классы не нужно ничего знать об их реализации иждивенца.

0

интерфейсы не могут быть созданы, они реализованы.

просто сделать конструктор, который принимает Interface типа

Container(Interface in){ 
    this.field = in; 
} 

Теперь при вызове Container конструктора передать любую реализацию вам нравится.

0

Как создать конструктор контейнера, поэтому при создании экземпляра он вызывает правильный конструктор в зависимости от того, передан ли ему параметр A или B?

Я думаю, что вы спрашиваете о конструкторах для класса Container, а не для интерфейса Interface (который не может иметь какой-либо) или для классов A и B (так как вы заранее предполагают, что объект одного из этих типов уже представленный как параметр). В том случае, если статический тип выражения параметра является одним из A или B, вы можете добиться того, что вы, как просто предоставляя перегруженные конструкторы:

public Container(A interface) { 
    // ... 
} 

public Container(B interface) { 
    // ... 
} 

С другой стороны, если вы предположить, что это известно только, что параметр реализует Interface, и все же вы хотите инициализировать Container по-разному в зависимости от того, какая реализация предусмотрена, тогда вы должны подумать еще раз. Это можно сделать, например, с помощью оператора instanceof для тестирования во время выполнения, реализация которого предусмотрена, но почти любой такой механизм является проявлением плохого дизайна, и на практике это может вызвать проблемы ,

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