2014-03-05 268 views
2

我對接口和繼承如何在實現階段工作感到困惑。這裏有一個快速的ERD:實現接口和繼承

          <<interface>> 
Animal         IColorChangable  
----------------------------    ----------------------- 
-color: int        ----------------------- 
----------------------------    + changeColor() 
----------------------------    ----------------------- 
     ^(Inheritance Triangle)    ^(Interface Triangle) 
     |         | 
     |         | 
---------------------------------------------- 
Dog 
---------------------------- 
-breed: string 
---------------------------- 
+ getBreed() 
---------------------------- 

所以在這裏我有一隻狗延長動物類,並且還實現了一個ColorChangable接口。現在,colorchangeable界面的工作是更新顏色,這是屬於動物的屬性,而不是Dog。那麼更新狗類顏色的正確方法是什麼?它是實現變色的狗,而不是動物。現在,我有這樣的:

public class Dog extends Animal implements IColorChangable 
{ 
    private String breed; 

    public Dog(int color, String breed) 
    { 
     super(color); 
     this.breed = breed; 
    } 

    public void changeColor() 
    { 
     //How to have access to color? 
    } 
} 

public interface IColorChangable 
{ 
    public void changeColor(); 
} 

回答

2

你基本上有三種選擇。你的選擇取決於你的需求,你的不變量的複雜性等

第一種方案是在Animal聲明colorprotected,那麼您可以在派生類直接訪問:

public class Animal { 
    protected int color; 
    ... 
} 

public class Dog extends Animal implements IColorChangable { 
    ... 
    @Override public void changeColor() { 
     color = ...; 
    } 
} 

的第二種選擇是在Animal中聲明private,在這種情況下,您無法直接使用子類訪問它,但可以根據您的規則向Animal(可選地final,可選protected)添加setter。如果,例如,你想實現在基類常見的驗證邏輯,這非常有用:

public class Animal { 
    private int color; 
    ... 
    protected final void setColor (int color) { // could be public, could be non-final 
     this.color = color; 
    } 
} 

public class Dog extends Animal implements IColorChangable { 
    ... 
    @Override public void changeColor() { 
     setColor(...); 
    } 
} 

第三個選項是要考慮的問題是:能否動物的顏色改變? (在你的榜樣,color是一般Animal的屬性。)如果是這樣,那麼你可以有Animal實現接口來代替:

public class Animal implements IColorChangable { 
    private int color; 
    ... 
    @Override public void changeColor() { 
     color = ...; 
    } 
} 

public class Dog extends Animal { 
    ... 
} 

這真的取決於你需要做什麼。

順便說一句,它不是通常是傳統在Java中啓動接口名稱與I就像它是在COM API中。另外我們通常使用「屬性」而不是「屬性」。:)

3

所以,你只需要爲setColor和的getColor添加到您的動物類,但你應該將它們定義爲一個公共方法。

public void setColor(int color){ 
    this.color = color; 
} 

public int getColor(){ 
    return color; 
} 

然後在changeColor方法中,您可以通過setColor填充顏色。

public void changeColor() 
{ 
    setColor(10); //for example 
} 
+1

非常真實,但不是問題? – KJ3

+0

對不起,我編輯了它。 –

+0

'setColor'和'getColor'不一定是'public',如果它更適合這種情況,它們可以被'保護'。另外值得注意的是,讓吸氣劑通常具有很大的意義,但它不是必需的。在更深層次上,如果'Animal'具有'color',則可能值得考慮如果'Animal'應該是實現'IColorChangable'的那個。 –

1
color = 123; 

但是你的屬性顏色必須設置爲公共的或受保護的。

如果是私人的,你需要做一個設置在動物類:

public void setColor(int color){ 
    this.color = color; 
} 

然後調用它在你的方法:

setColor(color); 
0

剛剛接觸它作爲普通的一員:

public void changeColor(int color) 
{ 
    this.color = color; 
} 
+1

由於OP沒有顯示'color'的訪問級別,所以我們不知道這是否可能(可能是'private')。此外,建議使用'@ Override'標籤來清楚說明(Eclipse,順便說一下,如果缺失,會默認生成警告)。 –