簡體   English   中英

抽象類從實現子類獲取參數?

[英]Abstract class get parameter from implementing subclass?

我想知道是否存在不破壞封裝的方法,我希望抽象類依賴於實現子類中定義的參數。 像這樣:

public abstract class Parent {

    private int size;
    private List<String> someList;

    public Parent() {
        size = getSize();
        someList = new ArrayList<String>(size);
    }

    public abstract int getSize();

}

public class Child extends Parent {

    @Override
    public int getSize() {
        return 5;
    }

}

這很丑嗎? 有沒有更好的辦法? 也許更重要的是,這是否是個好主意?

編輯:

這些類是在框架的上下文中創建的,因此默認的無參數構造函數始終是被調用的構造函數(實際上,Parent類擴展了另一個類)。 size參數僅用於說明目的,我不打算將其用於List實現。

不,不難看。 該模式稱為“模板方法”。 但是通常,如果該方法不是簡單的獲取方法,而是實現業務邏輯的方法,則它會更有用。

在您的情況下,另一種解決方案是在Parent類中定義受保護的構造函數,並使用child中的相關參數進行調用:

public abstract class Parent {

    private int size;
    private List<String> someList;

    protected Parent(int size) {
        this.size = size;
        someList = new ArrayList<String>(size);
    }

    public int getSize() {
        return size;
    }

}

public class Child extends Parent {
    public Child() {
        super(5);
    }
}

如果構造函數是您使用getSize()的唯一位置,則只需將其作為構造函數參數即可。

但更重要的是,為什么要關心尺寸? 除非您知道有問題,否則像其他所有人一樣使用默認大小:

public abstract class Parent {

    private List<String> someList = new ArrayList<String>();

    // use default constructor    
}

該模式並不難看,除非您嘗試在構造函數中使用它。 它允許您以意外的方式修改Child。

public class Child extends Parent {

    private int mySize = 5;

    @Override
    public int getSize() {
        // The -1 is only to help clarify what happens
        return mySize - 1;
    }

}

如果現在創建Child的實例,則實際上將引發異常,因為不允許負容量。 您應該意識到,僅在父構造函數完成后才初始化類的屬性。 (如果屬性是使用Parent構造函數設置的,並且在Child中定義了默認值,那么它將很樂意覆蓋您剛剛在Parent()中設置的值)

暫無
暫無

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

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