2015-11-16 20 views
1

這似乎是一個常見任務,但我有點困惑。假設我有一個帶有數據成員和相應的getter/setter的抽象父類。要求子類設置父類的數據成員

public abstract class Parent { 

    private MyObj myObj; 

    public MyObj getMyObj() { return myObj; } 
    public void setMyObj(MyObj myObj) { this.myObj = myObj; } 
} 

我需要強制子類設置「myObj」變量。我有2個選項:

  1. 使setter「抽象」(但不是吸氣劑)。這似乎很奇怪 我,我以前沒有見過它。
  2. 避免根據 家長聲明數據成員。只有一個父方法,

    abstract public MyObj getMyObj();

然後父總是引用作爲getMyObj()。getField1(),getMyObj()。getField2()等。每個創建一個新對象時,而不是將其存儲在一個地方。

什麼是強制子類設置父類的數據變量的標準方法?它是一個新的抽象方法,在getters/setters之外?

+0

爲什麼你甚至需要做到這一點?爲什麼不重複使用相同的數據成員,getter和setter? – Mureinik

+0

@Mureinik:原因是,雖然你可以從子類調用setMyObj(),但你不需要這樣做。但孩子必須設置它。 –

+2

如果該值是必需的,則需要在構造函數中使用該值。 – David

回答

8

可以讓編譯器強制執行myObj設置,你可以這樣做:

public abstract class Parent { 

    private final MyObj myObj; 

final意味着值不能改變,而且它必須設置。既然你有一個setter,價值可能會更新;如果這是預期不添加final關鍵字。

要確保字段設置,添加一個構造函數:

protected Parent(MyObj initial) { 
     if (initial == null) 
      throw new IllegalArgumentException("Must provide a value!"); 
     this.myObj = initial; 
    } 
0

您可以從您的子對象中調用setter方法。

+0

我可以調用setter方法,但是我不需要*這樣做。但必須要求孩子將其設置在父母身上。 –