#java
#java
Вопрос:
В Java, если у меня есть интерфейс:
public interface MyInterface{
}
Тогда MyInterface
реализация:
class MyClass implements MyInterface {
public MyClass(int a) {
}
}
Итак, я имею в виду, что если пользователь хочет сделать объявление MyInterface
экземпляра с помощью constructor:
MyInterface mine = new MyInterface(2);
тогда это невозможно, верно?
Комментарии:
1. ваш класс должен быть таким:
class myClassImpl implements myClass
. Также прочитайте это: download.oracle.com/javase/tutorial/java/concepts /…
Ответ №1:
MyInterface mine = new MyInterface(2);
тогда это невозможно, верно?
Это верно. Вы никогда не сможете сделать что-то вроде
MyInterface mine = new MyInterface(2);
После new
вам нужно выбрать класс, который реализует интерфейс(*), например MyClass
:
MyInterface mine = new MyClass(2);
Почему?
Вы можете думать об интерфейсе как о свойстве класса. Аналогией могло бы быть прилагательное, такое как «Красный». Имеет смысл создать, скажем, красный шар ( new RedBall()
) или красную машину ( new RedCar()
), но просто создавать «red» ( new Red()
) не имеет смысла («красный что такое??»).
(*) Вы можете создавать анонимные классы, которые реализуют интерфейс «на лету», выполнив new MyInterface() { ... }
но, технически говоря, вы все еще создаете экземпляр класса.
Ответ №2:
Вы правы. Интерфейс может не указывать конструктор, конструктор указывается в классе, который реализует интерфейс.
public interface Foo {
public void doSomething();
}
public class Bar implements Foo() {
public Bar(int value) {
}
@Override
public void doSomething() {
}
}
затем, когда вы хотите использовать свой интерфейс, вам нужно сделать что-то вроде
Foo foo = new Bar(2);
Комментарии:
1. Привет, это выглядит красиво. Но если у меня есть что-то вроде этого: я не могу создать экземпляр типа Foo следующим образом: Foo foo = new Foo()?
2. Нет, поскольку Foo — это интерфейс, он не может быть создан. Могут быть созданы экземпляры только классов
Ответ №3:
Вы не можете создать экземпляр интерфейса напрямую. Вам нужно использовать экземпляр реализующего класса:
myClass mine = new myClassImpl();
Ответ №4:
Невозможно определить сигнатуру конструктора в интерфейсе java.
Если вы хотите обеспечить построение объектов с использованием определенной подписи, вашими вариантами являются следующие шаблоны проектирования:
Ответ №5:
Верно, это невозможно. То, что вы хотите сделать, может быть выполнено, следуя заводскому шаблону. Единственное, что код, который вы изложили в своем вопросе, оставляет неуказанным, — это то, какой класс, реализующий ваш интерфейс, вообще должен быть создан. Ваша заводская реализация — это место, где вы выражаете свои намерения по этому поводу в коде. Схема для фабрики может быть примерно такой, чтобы вы могли начать:
public class FooFactory {
public myClass createFoo() {
if (/* some condition */) {
return new myClassImpl(/* the constructor parameters for that implementation */);
} else {
/* return some other implementation; you get the idea */
}
}
Ответ №6:
Нет, не возможно объявить экземпляр MyClass, поскольку это интерфейс.
Интерфейсы не определяют конструктор, но класс, реализующий интерфейс, все еще имеет конструктор.
Если вы намерены сделать невозможным для пользователя вызов конструктора вашего класса, вы всегда можете сделать конструктор закрытым.