Itu mungkin tetapi tidak seperti yang Anda miliki.
Anda harus menambahkan konstruktor no-args ke kelas dasar dan hanya itu!
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";
}
}
Ketika Anda tidak menambahkan konstruktor (apa saja) ke kelas, kompilator menambahkan konstruktor default no arg untuk Anda.
Ketika defualt no arg memanggil super (); dan karena Anda tidak memilikinya di kelas super, Anda mendapatkan pesan kesalahan itu.
Itu tentang pertanyaan itu sendiri.
Sekarang, memperluas jawabannya:
Apakah Anda sadar bahwa membuat subclass (perilaku) untuk menentukan nilai (data) yang berbeda tidak masuk akal ?? !!! Saya harap Anda melakukannya.
Jika satu-satunya hal yang berubah adalah "nama" maka satu kelas parametrized sudah cukup!
Jadi Anda tidak membutuhkan ini:
MyClass a = new A("A");
MyClass b = new B("B");
MyClass c = new C("C");
MyClass d = new D("D");
atau
MyClass a = new A();
MyClass b = new B();
MyClass c = new C();
MyClass d = new D();
Kapan Anda bisa menulis ini:
MyClass a = new MyClass("A");
MyClass b = new MyClass("B");
MyClass c = new MyClass("C");
MyClass d = new MyClass("D");
Jika saya mengubah tanda tangan metode konstruktor BaseClass, saya harus mengubah semua subclass.
Itulah mengapa pewarisan adalah artefak yang menciptakan kopling TINGGI, yang tidak diinginkan dalam sistem OO. Ini harus dihindari dan mungkin diganti dengan komposisi.
Pikirkan jika Anda benar-benar membutuhkannya sebagai subclass. Itulah mengapa Anda sering melihat antarmuka yang digunakan insted:
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
Di sini B dan C bisa mewarisi dari A yang akan menciptakan kopling yang sangat TINGGI di antara mereka, dengan menggunakan antarmuka kopling dikurangi, jika A memutuskan itu tidak lagi menjadi "NameAware" kelas lain tidak akan rusak.
Tentu saja, jika Anda ingin menggunakan kembali perilaku ini tidak akan berhasil.