这里组合的正确实施是什么? 我有一个类Cat,其中包含_gallonsOfMilkEaten变量,因为只有猫喝牛奶。然后我还有一个带有Age的Animal类,因为所有的动物都有一定的年龄。 现在,我需要在Cat和Dog类中使用Age变量。
我应该这样做:
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()
{
//...
}
}
答案 0 :(得分:2)
首先,如果你有充分的理由使用合成而不是继承,代码是有意义的。遗传应该是默认选择,因为狗和猫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 :(得分:1)
我要发表反对意见。虽然你特别要求组合,但这个特殊的用例并没有多大意义。 Cat
和Dog
没有拥有动物,他们是动物,所以你应该在这里使用继承,而不是组合。
class Animal
{
public float Age {get; protected set; }
}
然后,您的Cat
和Dog
类看起来像这样
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()
{
//...
}
}
这允许Cat
和Dog
使用Age
成员,就像它们被合成一样(因为它是),但不会不必要地重复嵌套Animal
作为会员。在您的特定用例中,这几乎可以肯定是您真正想要的。在其他案例中,有时候合成更好。例如,Animal
有一个 Age
,但Animal
不是float
。