เป็นไปได้ แต่ไม่ใช่ในแบบที่คุณมี
คุณต้องเพิ่มตัวสร้าง 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";
}
}
เมื่อคุณไม่ได้เพิ่มคอนสตรัคเตอร์ (ใด ๆ ) ในคลาสคอมไพลเลอร์จะเพิ่มตัวสร้างอาร์กิวเมนต์เริ่มต้นให้กับคุณ
เมื่อ 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();
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 ควรหลีกเลี่ยงและอาจแทนที่ด้วยองค์ประกอบ
คิดว่าคุณต้องการมันเป็นคลาสย่อยจริงๆหรือไม่ นั่นเป็นเหตุผลที่คุณเห็นอินเทอร์เฟซที่ใช้บ่อยมาก:
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
ที่นี่ B และ C อาจได้รับการสืบทอดมาจาก A ซึ่งจะสร้างการเชื่อมต่อที่สูงมากในหมู่พวกเขาโดยการใช้อินเตอร์เฟสการเชื่อมต่อจะลดลงถ้า A ตัดสินใจว่าจะไม่เป็น "NameAware" อีกต่อไปคลาสอื่น ๆ จะไม่พัง
แน่นอนว่าหากคุณต้องการใช้พฤติกรรมซ้ำสิ่งนี้จะไม่ได้ผล