Mümkün ama sahip olduğunuz yol değil.
Temel sınıfa argümansız bir kurucu eklemelisiniz ve işte bu kadar!
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";
}
}
Bir sınıfa bir yapıcı (herhangi) eklemediğinizde, derleyici sizin için varsayılan no arg oluşturucusunu ekler.
Varsayılan hiçbir argüman super () 'i çağırdığında; ve süper sınıfta olmadığından bu hata mesajını alıyorsun.
Kendisinin sorusu bu.
Şimdi cevabı genişleterek:
Farklı bir değeri (verileri) belirtmek için bir alt sınıf (davranış) oluşturmanın bir anlamı olmadığının farkında mısınız ?? !!! Umarım yaparsın.
Değişen tek şey "isim" ise, parametreleştirilmiş tek bir sınıf yeterlidir!
Yani buna ihtiyacınız yok:
MyClass a = new A("A");
MyClass b = new B("B");
MyClass c = new C("C");
MyClass d = new D("D");
veya
MyClass a = new A();
MyClass b = new B();
MyClass c = new C();
MyClass d = new D();
Bunu ne zaman yazabilirsin:
MyClass a = new MyClass("A");
MyClass b = new MyClass("B");
MyClass c = new MyClass("C");
MyClass d = new MyClass("D");
BaseClass yapıcısının yöntem imzasını değiştirirsem, tüm alt sınıfları değiştirmem gerekirdi.
İşte bu yüzden kalıtım, OO sistemlerinde istenmeyen YÜKSEK kuplajı yaratan eserdir. Önlenmeli ve belki kompozisyonla değiştirilmelidir.
Onlara gerçekten alt sınıf olarak ihtiyacınız olup olmadığını düşünün. Bu nedenle, sıklıkla kullanılan arayüzleri görüyorsunuz:
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
Burada B ve C, aralarında çok YÜKSEK bir bağlantı oluşturacak olan A'dan miras almış olabilir, arayüzler kullanılarak bağlantı azaltılır, A artık "NameAware" olmayacağına karar verirse diğer sınıflar bozulmaz.
Elbette, davranışı yeniden kullanmak istiyorsanız bu işe yaramayacaktır.