それは可能ですが、あなたが持っている方法ではありません。
引数なしのコンストラクターを基本クラスに追加する必要があります。それだけです!
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";
}
}
コンストラクター ( any ) をクラスに追加しない場合、コンパイラーはデフォルトの引数なしコンストラクターを追加します。
デフォルトの no arg が super(); を呼び出す場合。スーパークラスにそれがないため、そのエラーメッセージが表示されます。
それはそれ自体の質問です。
さて、答えを展開します:
異なる値 ( data ) を指定するためにサブクラス ( behavior ) を作成しても意味がないことに気付いていますか??!!! お願いします。
変更されるのが「名前」だけの場合は、パラメータ化された単一のクラスで十分です!
したがって、これは必要ありません:
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");
BaseClass コンストラクターのメソッド シグネチャを変更する場合、すべてのサブクラスを変更する必要があります。
そのため、継承は、OO システムでは望ましくない HIGH 結合を作成するアーティファクトです。それは避けるべきであり、おそらくコンポジションに置き換える必要があります。
サブクラスとして本当に必要かどうかを考えてください。そのため、以下のように使用されるインターフェースが頻繁に見られます。
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
ここで、B と C は A から継承され、それらの間で非常に高い結合が作成された可能性があります。インターフェースを使用することで結合が減少し、A が「NameAware」ではなくなると判断した場合、他のクラスは壊れません。
もちろん、動作を再利用したい場合、これは機能しません。