如何在C#组合中正确处理变量?

时间:2016-07-15 19:33:15

标签: c#

这里组合的正确实施是什么? 我有一个类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()
    {
       //...
    }
}

2 个答案:

答案 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)

我要发表反对意见。虽然你特别要求组合,但这个特殊的用例并没有多大意义。 CatDog没有拥有动物,他们动物,所以你应该在这里使用继承,而不是组合。

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