2014-11-21 22 views
0
*----------------*     *----------------*   *--- 
|  Duck  |     | RubberDuck |   |  
|----------------|     |----------------|   |--- 
|color: ""  | extends to |color: "Yellow" |   | 
|numLeg: 2  | ----------> |numLeg: 0  | and |  ... 
|haveWings: True |     |haveWings: True |   | 
|----------------|     |----------------|   |--- 
|swim()   |     |swim()   |   | 
*----------------*     *----------------*   *--- 

從上圖中可以看出,如果我想將Duck類擴展到另一個具有不同類屬性值的Duck-like類。我應該怎麼做?如何創建子類,使其屬性值不會從父類重寫?

由於我已經搜索了一些信息,我知道該屬性不能被覆蓋。那麼我認爲我的設計是錯誤的(在面向對象的設計中是錯誤的)。請給我一些建議,以「簡單的面向對象的方式」改進我的程序(或重新設計我的程序)。

請注意,我不關心鴨類(因爲我只是用它作爲原型)。鴨類將有屬性或沒有屬性不重要,但在我的設計中,我只是認爲母類應該有一些默認值(這可能是我的誤導)。

回答

2

我看不出這裏有什麼概率:)
屬性值可以被輕易改變,它的屬性類型不能是改性。

public class Duck() { 
    private String color; 
    private int numLeg ; 
    private boolean haveWings ; 

    public Duck(String aColor, int aNumLeg, boolean hasWings) { 
    color=aColor; 
    numLeg=aNumLeg; 
    haveWings=hasWings; 
    } 

    public Duck() { 
    this("", 2, true); // a little trick for lazy man ;) 
    } 
} 

然後,你可以很容易地改變一個子類的屬性,調用Duck構造。

public class SubDuck extends Duck { 
    public SubDuck() { 
    super("Yellow", 0, true); 
    } 
} 
+0

完美答案!我想我以前就知道這一點,但可能會忘記它。非常感謝你。 – fronthem 2014-11-21 08:33:47

+0

對不起@尼日爾,如果沒有特技線。這還能工作嗎?如果使用這個技巧,我會覺得有點難以閱讀。 – fronthem 2014-11-21 09:21:36

+1

@ terces907當然!第一個構造函數是最重要的,因爲它是在子類中用'super(...)'調用的構造函數,第二個構造函數只是爲了方便,所以可以將其刪除。別客氣 ;) – NiziL 2014-11-21 09:46:18

0
class Duck 
{ 
protected String color; 
protected int numLeg; 
protected boolean haveWings; 

public Duck() 
{ 
    color = ""; 
    numLeg = 2; 
    haveWings = true; 
} 

public void swim() 
{ 
    //Do something 
} 
} 


class RubberDuck extends Duck 
{ 
public RubberDuck() 
{ 
    color = "yellow"; 
    numLeg = 0; 
    haveWings = true; 
} 

public void swim() 
{ 
    //Do something 
} 
} 
1

創建鴨兩個構造

  1. 首先一個不帶任何參數,在這裏您可以定義屬性的默認值
  2. 第二個採取一切價值 - >這個人是在子類中使用
1

使用過載的構造函數來設置參數。

//This constructor can only be called by inheriting classes 
//Since it is java, other classes in the package can do as well, but you can avoid. 
protected Duck(String color1, int numLeg1, int haveWings1){ 
    this.color = color1; 
    this.numLeg = numLeg1; 
    this.haveWings = haveWings1; 
} 

//For setting default values and creating duck objects. 
//Not needed if you don't want to generate plain Ducks 
public Duck(){ 
    this.color = ""; 
    this.numLeg = 2; 
    this.haveWings = true; 
} 

然後在您調用鴨構造函數來設置參數的RubberDuck構造函數。 public RubberDuck(){ super(「yellow」,0,true); } 其他類可以使用類似的方法: public PoorDuck(){「{」}「>} {super(」pink-blue「,1,false); }

0

如果你不在乎和使用Duck作爲原型,那麼我會建議創建Duck作爲interfase或抽象類,然後你可以編寫分別實現或擴展Duck的具體類。

相關問題