2016-07-15 51 views
0

這裏作文的正確實施是什麼? 我有一類貓,它含有_gallonsOfMilkEaten變量,因爲只有貓喝牛奶。然後我也有一個動物類與年齡,因爲所有的動物都有一定的年齡。 現在,我需要在Cat和Dog類中使用Age變量。如何在C#中正確處理變量?

我應該做這樣的:

class Animal 
{ 
    public float Age = 35; 
} 

class Cat 
{ 
    private float _gallonsOfMilkEaten; 
    private Animal _animal = new Animal(); 

    public void Meow() 
    { 
     Debug.log("This dog ate "+_gallonsOfMilkEaten+" gallons of milk and is " + _animal.Age+" years old.")} 
    } 
} 


class Dog 
{ 
    private float _bonesBurried; 
    private Animal _animal = new Animal(); 

    public void Woof() 
    { 
     //... 
    } 
} 

或者這樣,在他們每個人都有自己的變量?:

class Animal 
{ 

} 

class Cat 
{ 
    private float _gallonsOfMilkEaten; 
    private Animal _animal = new Animal(); 
    private float _age = 35; 

    public void Meow() 
    { 
     Debug.log("This dog ate "+_gallonsOfMilkEaten+" gallons of milk and is " + _age+" years old.")} 
    } 
} 


class Dog 
{ 
    private float _bonesBurried; 
    private Animal _animal = new Animal(); 
    private float _age = 35; 

    public void Woof() 
    { 
     //... 
    } 
} 
+2

爲什麼狗和貓都不會繼承動物,那裏的動物有年齡? (這是舊的「是」或「有」的測試)。 – onupdatecascade

回答

2

首先definiton,代碼是有道理的情況下,你有充分的理由使用組合而不是繼承。繼承應該是默認選擇,因爲狗和貓ARE動物不是HAVE動物。

你應該保持在Animal類的年齡,如果你不這樣做,那麼這個類有什麼意義?但是,您不應將其定義爲公共領域,但首選公共領域是首選:

class Animal { 
    private float _age = 35; 
    public float Age { 
     get { 
     return this._age; 
     } 
    } 
}  
class Cat { 
    private float _gallonsOfMilkEaten; 
    private Animal _animal = new Animal(); 

    public void Meow() { 
     Debug.log("This dog ate "+_gallonsOfMilkEaten+" gallons of milk and is " + _animal.Age +" years old.")} 
    } 
} 
class Dog { 
    private float _bonesBurried; 
    private Animal _animal = new Animal(); 

    public void Woof() { 
     //... 
    } 
} 
+1

正如問題的評論所指出的那樣,「Cat」和「Dog」會繼承* Animal而非構成一隻貓。貓沒有*動物,它們*是動物。 –

+2

除非您從'Animal'繼承,'age'在本例中不可訪問爲'protected'。 – Tone

+1

而且,如果你繼承它,那麼把它留給「公共」更有意義。 (雖然屬性很好) –

1

我打算髮表反對意見。當你特別要求組合時,這個特殊的用例並沒有多大意義。 Cat s和Dog s不要動物,他們動物,所以你應該真的在這裏使用繼承,而不是組成。

class Animal 
{ 
    public float Age {get; protected set; } 
} 

然後你CatDog類看起來像這樣

class Cat : Animal 
{ 
    private float _gallonsOfMilkEaten; 

    public void Meow() 
    { 
     Debug.log("This dog ate " + _gallonsOfMilkEaten + " gallons of milk and is " + Age + " years old.")} 
    } 
} 

class Dog : Animal 
{ 
    private float _bonesBurried; 

    public void Woof() 
    { 
     //... 
    } 
} 

這使得CatDog使用Age成員,就好像是合成到他們(因爲它),但不不必要地重複作爲成員的嵌套Animal。在你的具體用例中,這幾乎肯定是你真正想要的。在其他的情況下,有時候成分更好。這裏,例如,Animal具有Age,但是Animal不是float

+0

在實踐中,繼承總是首選這類問題。但實際上,有些情況下你不能或者你不想使用繼承,有時你需要犧牲純粹的OO。 –