首页 文章

课堂设计的选择[关闭]

提问于
浏览
1

我有典型的课堂设计问题,我想得到你的意见 .

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

class 犬;班猫;班鸟; class Animal {private:int legs; public:virtual void Interact(const dog&)= 0; virtual void Interact(const cat&)= 0; virtual void Interact(const bird&)= 0; };

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

class dog:public Animal {//与其他动物交互的实现:void Interact(const dog&object); void Interact(const cat&object); void Interact(const bird&object); };

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

类FlyingAnimal:公共动物{private:int wings; public:void Fly(); };

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

class Bird:public FlyingAnimal {body and definition of void Interact(...)...};

你觉得怎么样?也许你有另一个建议 .

提前谢谢了 ! Xtof

2 回答

  • 2

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

    因此,您应该以更通用的方式处理交互 . 为什么猫会捕杀老鼠或小鸟,而不是狗?当我面对一只带着smibblat的猫时会发生什么? (smibblat是一种小的,蓬松的,四足的食草哺乳动物,长约5厘米,我刚刚编造并写了一份 class Smibblat: public Animal ) . 即使猫之前从未见过Smibblat,它也会试图捕捉它,因为它适合它的猎物模式 . 猫对所有动物都是一种危险,它们比自己小1和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,它提供了决定是否吃其他动物的所有重要方法 .

  • 1

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

相关问题