簡體   English   中英

調用抽象類的構造函數

[英]Calling the constructor of an abstract class

假設我有以下類結構:

public class A{
    A(int a){
        ...
    }
}

abstract class B extends A{

}

public class C extends B{
    C(int a){
        super(a);
    }
}

在myMethod不會調用A的構造函數的意義上,此代碼無效。 有沒有辦法做到這一點?

我最終想要做的是在不影響其功能的情況下為一組類添加功能。 所有這些類當前都擴展了一個公共類(runtimeException),所以我想添加一個中間抽象類。

(編輯:C中的代碼不應該是一個方法,它應該是一個構造函數)

你不能像你寫的那樣申報B級。 要創建B的實例,您需要調用A構造函數:

public abstract class B extends A {
    public B() {
        super(10); //or other number
    }
}

public class C extends B {
    public C(int a) {
        super();
    }
}

換句話說,你總是調用“上一級”的構造函數,無論類是否是抽象的。

為了避免這個奇怪的數字10我編寫並缺少C構造函數的int參數,我建議至少為子類構造函數添加父類構造函數對任何extends對類所需的所有參數。

我經常看到的是這樣的模式:

public class A{
    A(int a){
        ...
    }
}

abstract class B extends A{
    B(int a) {// "proxy" constructor"
        super(a);
    }
}

public class C extends B{
    C(int a) {
         super(a);
    }

    void myMethod(int a){
        // super(a); <- note this is invalid code, you can only call this from the constructor
        new C(0); // <-- this is valid
    }
}

當然,它有點冗長和樣板,但它允許您避免重復任何功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM