4

考虑这个类图:

 +--------+     * +------------------+ * afraid-of             +------------+
 | Garden |------>|    Animal        |<------------------------| Baby       |
 +--------+       +------------------+                         +------------+
                        ^
                        |
                 +----------+------+
                 |                 |
          +------+------+   +------+-----+
          | Cat         |   | Wolf       |
          +-------------+   +------------+

动物有两个作用:

  1. 他们将在花园里走来走去(班级实例)
  2. 宝宝害怕一些动物(班级类型)

应该养什么宝宝?它害怕的每一种动物都有一个实例?(听起来像糟糕的设计)类型名称?(我总是尽量避免重构)

这应该如何解决?(我使用的是 C#,我只在最后提到它,因为我希望这里有一个通用的、无语言的设计模式或想法)

谢谢

4

3 回答 3

4

如果婴儿总是害怕相同的动物,你不必保留任何东西。你可以有一个方法:

public bool IsAfraid(Animal animal)
{
    return animal is Wolf;
}

如果宝宝在不同的地方、不同的时间害怕不同的动物,你应该让每一个动物都有一个属性AnimalType(标志枚举)。然后,婴儿将拥有一个 AnimalType 类型的属性 AfraidOf。然后,检查你是否害怕动物很简单:

bool afraid = this.AfraidOf.HasFlag(animal.AnimalType);

最后,对于架构中不同类型的关系(包含、继承、害怕),您可能应该有不同类型的链接到不同的类。

于 2012-04-21T17:13:50.680 回答
0

ABaby可以列出他/她害怕的动物。我会指定独立的方法来从列表中添加和删除动物,因为随着时间的推移,可以删除或添加一些动物。可以直接通过属性更改动物列表,但在这种情况下我更喜欢特定的方法。

public class Animal { }
public class Cat : Animal { }
public class Wolf : Animal { }

public class Baby
{
    public List<Animal> ScaryAnimalsList { get; private set; }

    public Baby()
    {
        ScaryAnimalsList = new List<Animal>();
    }

    public void AddAnimalToScaryList(Animal animal)
    {
        ScaryAnimalsList.Add(animal);
    }

    public void RemoveAnimalFromScaryList(Animal animal)
    {
        if (ScaryAnimalsList.Contains(animal))
            ScaryAnimalsList.Remove(animal);
    }

    public bool IsAffraidOf(Animal animal)
    {
        return ScaryAnimalsList.Contains(animal);
    }
}

这就是如何使用它

class Program
{

    static void Main(string[] args)
    {
        Cat cat = new Cat();
        Wolf wolf = new Wolf();

        var babyJo = new Baby();
        babyJo.AddAnimalToScaryList(wolf);
        babyJo.IsAffraidOf(wolf);   //true
        babyJo.IsAffraidOf(cat);    //false

        var babySam = new Baby();
        babySam.AddAnimalToScaryList(wolf);
        babySam.AddAnimalToScaryList(cat);
        babySam.IsAffraidOf(wolf);   //true
        babySam.IsAffraidOf(cat);    //true

        var babyBob = new Baby();
        babyBob.IsAffraidOf(wolf);   //false
        babyBob.IsAffraidOf(cat);    //false
    }
}
于 2012-04-21T17:45:33.433 回答
0

另一种选择是为您的动物添加功能。

public class Animal
{
    public virtual bool EatsSmallChildren { get { return false; } }
}

然后你的宝宝可以检查动物是否害怕而不是宝宝是否害怕它。

这给你的动物类增加了负担,并引入了一些概念上的耦合,但也非常简单,易于理解和维护。

于 2012-04-21T18:02:19.017 回答