课堂设计的选择

  • 本文关键字:选择 课堂 c++ class
  • 更新时间 :
  • 英文 :


我有一个典型的类设计问题,我想听听你的意见。

让我们想象一下,我有一个基础类动物。从这一类中,我衍生出了几类特定的动物。我对他们之间的互动很感兴趣。由于它们的交互可能因动物而异,我所做的是创建具有纯虚拟函数的基类,即抽象类:

类狗;

阶级猫;

类鸟;

动物类{

私有:

int腿;

公用:

虚拟void交互(constdog&)=0;

虚拟void交互(const-cat&)=0;

虚拟虚空交互(const bird&)=0;

};

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

类狗:公共动物{

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

void交互(const dog&object){…body…};

void交互(const cat&object){…body…};

void交互(const bird&object){…body…};

};

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

classFlyingAnimal:公共动物{

私有:

int wings;

公用:

void Fly();

};

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

类鸟:公共飞行动物{

本体和空洞的定义交互(…)…

};

你对此怎么看?也许你还有其他建议。

非常感谢!Xtof

当你只有三个类时,为每种可能的其他动物提供不同的交互方法是可行的,但当你添加老鼠、兔子、老虎、大鼠、enchiladas、袋熊、海豚、armadillos和斑马时,它会很快变得难以处理,因为每当你添加一种新动物时,你需要编辑每个现有的类来添加一个新的交互方法。面向对象编程不应该是这样的。面向对象编程的目的是,你可以简单地添加一个新类,所有其他类都可以立即使用它,而不需要任何修改。

因此,您应该以更通用的方式处理交互。为什么猫抓老鼠或鸟,而不抓狗?当我面对一只傻笑的猫时会发生什么?(smibblat是一种小型、蓬松、四条腿、草食性哺乳动物,大约5厘米长,我刚刚为它编了一个class Smibblat: public Animal)。即使猫以前从未见过Smibblat,它也会试图猎杀它,因为它符合猎物的模式。猫对所有动物都是危险的。较小和2。比他们自己慢。

当您将抽象getSize()和抽象getSpeed()方法添加到Animal类时,您可以有这样的方法:

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

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

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

最新更新