课堂设计的选择

时间:2014-01-10 10:10:54

标签: c++ class

我有典型的课堂设计问题,我希望得到你的意见。

让我们假设我有一个基类Animal。从这个课程中我得到了几类特定的动物。我对他们的相互作用很感兴趣。由于它们的交互因动物而异,我所做的是用纯虚函数创建基类,即抽象类:

  

班级狗;

     

class cat;

     

班鸟;

     

class Animal {

     

私人:

     

int legs;

     

公共:

     

virtual void Interact(const dog&)= 0;

     

virtual void Interact(const cat&)= 0;

     

virtual void Interact(const bird&)= 0;

     

};

然后,对于每个特定的动物,我从Animal类创建一个派生类。例如:

  

类狗:公共动物{

     

//与其他动物互动的实施:

     

void Interact(const dog& object){... body ...};

     

void Interact(const cat& object){... body ...};

     

void Interact(const bird& object){... body ...};

     

};

类似于猫和鸟类。 现在我关心鸟类。鸟类可以飞行并拥有狗和猫没有的额外变量/方法。管理它的聪明方法是什么?例如,一种强力方式是向基类添加动物额外的方法和变量,如int wingsvoid fly()。重点是它们不会被狗和猫类使用。它不干净。 也许另一种方式可以从Animal声明派生类FlyingAnimal:

  

类FlyingAnimal:公共动物{

     

私人:

     

int wings;

     

公共:

     

void Fly();

     

};

然后我可以从这个创建类Bird而不是Animal:

  

班鸟:公共FlyingAnimal {

     

void的主体和定义Interact(...)......

     

};

你怎么看?也许你有另一个建议。

非常感谢提前! Xtof

2 个答案:

答案 0 :(得分:2)

对于每种可能的其他动物采用不同的交互方法将在你只有三个班级时起作用,但是当你添加老鼠,兔子,老虎,老鼠,辣酱玉米饼馅,袋熊,海豚,犰狳和斑马时,它会很快变得笨拙,因为无论何时添加新动物,您都需要编辑每个现有类以添加新的交互方法。这不是面向对象编程应该如何。 OOP的目的是您可以简单地添加一个新类,所有其他类可以立即使用它而无需任何修改。

因此,您应该以更一般化的方式处理交互。为什么猫会捕杀老鼠或小鸟,而不是狗?当我面对一只带着smibblat的猫时会发生什么? (smibblat是一种小的,蓬松的,四足的食草哺乳动物,长约5厘米,我刚刚编造并写了class Smibblat: public Animal。即使猫之前从未见过Smibblat,它也会试图捕捉它,因为它适合它的猎物模式。猫对所有动物都是一种危险,它们比它们自己小1和2。

如果要向Animal类添加抽象getSize()和抽象getSpeed()方法,可以使用这样的方法:

void Cat::interact(const Animal & other) {
     if (other.getSpeed() < this.getSpeed() &&
         other.getSize() < this.getSize()) {
         this.eat(other);
     }
}

可以应用于您创建的任何新动物。 Cat类将不再依赖于其他所有Animal子类。它只依赖于Animal,它提供了决定是否吃其他动物的所有重要方法。

答案 1 :(得分:1)

我认为你做错的第一件事就是在基类的接口中派生类。 您应该使用Visitor pattern。您可以为所有三个动物类创建通用交互访问者或三个单独的访问者。然后,您将要与之交互的动物作为构造函数参数提供。