Возможно, но не так, как у вас есть.
Вы должны добавить конструктор no-args в базовый класс и все!
public abstract class A {
private String name;
public A(){
this.name = getName();
}
public abstract String getName();
public String toString(){
return "simple class name: " + this.getClass().getSimpleName() + " name:\"" + this.name + "\"";
}
}
class B extends A {
public String getName(){
return "my name is B";
}
public static void main(String [] args) {
System.out.println(new C());
}
}
class C extends A {
public String getName() {
return "Zee";
}
}
Если вы не добавить конструктор (любой) к классу компилятора добавить параметр по умолчанию не ARG застройщика для вас.
Когда defualt no arg вызывает super(); и поскольку у вас его нет в суперклассе, вы получаете это сообщение об ошибке.
Это вопрос о себе.
Теперь, расширив ответ:
Вы знаете, что создание подкласса (поведение), чтобы задать другой другое значение (данные) не имеет смысла ?? !!! Надеюсь, вы это сделаете.
Если единственное, что есть изменения, это «имя», тогда достаточно одного параметризованного класса!
Так что вам не нужно это:
MyClass a = new A("A");
MyClass b = new B("B");
MyClass c = new C("C");
MyClass d = new D("D");
или
MyClass a = new A(); // internally setting "A" "B", "C" etc.
MyClass b = new B();
MyClass c = new C();
MyClass d = new D();
Когда вы можете написать это:
MyClass a = new MyClass("A");
MyClass b = new MyClass("B");
MyClass c = new MyClass("C");
MyClass d = new MyClass("D");
If I were to change the method signature of the BaseClass constructor, I would have to change all the subclasses.
Ну вот почему наследование артефакт который создает HIGH-соединение, которое является unde желательно в OO-системах. Его следует избегать и, возможно, заменить композицией.
Подумайте, действительно ли они действительно нужны в качестве подкласса. Вот почему вы видите очень часто интерфейсы, используемые InstEd:
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
Здесь B и C может унаследовали от А, который бы создал очень высокое сцепление между ними, с помощью интерфейсов муфты уменьшается, если А решает, что будет больше не будет «NameAware», другие классы не сломаются.
Конечно, если вы хотите повторно использовать поведение, это не сработает.
Пожалуйста, оставьте «избыточный» конструктор! Он поддерживает читаемость вашего кода, и все современные IDE могут создавать его автоматически, поэтому вам просто нужно назначить ярлык. –
Повторный просмотр моего собственного вопроса через год, и мне приходит в голову, что я мог бы удалить конструкторы (включая базовый класс), например матовый b, а затем использовать статический заводский метод для сборки экземпляров. – Joel