[英]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.