我有一个派生子类继承的基本类,它具有在所有派生类中应该相同的基本函数:

class Basic {
public:
    Run() {
        int input = something->getsomething();
        switch(input)
        {
            /* Basic functionality */
            case 1:
                doA();
                break;
            case 2:
                doB();
                break;
            case 5:
                Foo();
                break;
        }
    }
};

现在,基于派生类,我想向开关“添加”更多 case 语句。我在这里有什么选择?我可以声明虚函数并仅在将要使用它们的派生类中定义它们:

class Basic {
protected:
    virtual void DoSomethingElse();
public:
    Run() {
        int input = something->getsomething();
        switch(input)
        {
            /* Basic functionality */
            ...

            case 6:
                DoSomethingElse();
        }
    }
};


class Derived : public Basic {
protected:
    void DoSomethingElse() { ... }
}

但这意味着当更改任何派生类中的函数时,我必须编辑我的基类以反映这些更改。

有没有专门针对此类问题的设计模式?我购买了一些关于设计模式的书籍,但我正在“按需要”学习它们,所以我不知道是否有我正在寻找的这种模式。

有帮助吗?

解决方案

您可能会发现有用的noreferrer">责任模式链阅读模板方法模式

其他提示

我想你需要的模式是链责任或也许策略结合动态调用表...

处理这个问题的正常方法是使用工厂。概要:

  • 创建提供功能的相关类的层次结构。
  • 创建一个工厂类,该工厂类接受输入并根据输入创建正确类型的类的实例

现在增加奖励积分:

  • 创建一个在工厂中注册类的方案 - 您需要指定输入和类的类型来处理它

现在,当需要新输入时,您只需派生一个新类并将其注册到工厂即可。对 switch 语句的需要消失了。

如果您选择值只是小的整数,我会通过查找表代替case语句。 (该案件的行动将每个需要被编码为一个功能,所以你可以把函数指针表中的)。然后,继承类可以直接添加条目表。 (我猜的表必须是一个实例属性,它不能是静态的)。

科林

  

但是,当改变,这将意味着   在任何派生类的功能,我   不得不修改我的基类   反映这些变化。

为什么会变成这样是真的吗?

我照亮您的评论的 - 那么,如果你选择这种方法,你就会有这些问题。其他人张贴另外的方案的答案 - 我会检查这些了,看他们是否帮助你

А简单的解决方案:

class Basic {
  public:
    void Run() {
      const int input = ...
      if (!(BaseProcess(input) || Process(input))) ...
    }

    vitual bool Process(int input) { return false; }

    bool BaseProcess(int input) {
      switch(input) {
    ...
        default: return false;
      }
      return true;
    }
...

...然后实现子类的附加箱子处理()。 如果需要支持多于2个电平(即子子类中添加更多的情况下),那么就需要一个动态调度表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top