c++ - 隐藏代码选择Interface类的Derived类?

标签 c++ interface

假设我有一个像

这样的接口(interface)类
class car {
  public: 
    virtual void move(double x, double y) = 0;
  // etc etc
};

还有很多派生类,比如

class model8556 : virtual public car {
  private: 
    void move(double x, double y) {
      // ...
    }
  // etc etc
};

我通过以下方式选择模型

car* myCar;    
switch (foo) {
  case 1: myCar = new model3434(); break;
  case 2: myCar = new model8295(); break;
  // etc
}

是否有隐藏开关代码并可能将其移动到 car 类本身的好方法?我可以围绕 car 包装另一个类(?)(或者只是将开关代码移动到全局函数?),但我想知道是否有更优雅的东西。

感谢任何帮助。

最佳答案

当然值得将开关代码提取到一个单独的函数中,因为您希望避免在您的代码周围重复它。

您可以将它放在类的静态函数中。有些人会把它放在 Car 本身,但我不推荐它,因为它将 Car 耦合到派生类,你必须小心循环依赖。有些人会将它作为一个静态函数放在自己的类中。这有时被描述为 Simple Factory .

但在 C++ 中,将它放在非成员函数中并没有错:

#include <memory>

class Car {
  public: 
    virtual ~Car() {}
    virtual void move(double x, double y) = 0;
};

class Model3434 : public Car {
  public: 
    void move(double, double) override { }
};

class Model8295 : public Car {
  public: 
    void move(double, double) override { }
};

std::unique_ptr<Car> createCar(int foo) {
    switch (foo) {
      case 1: return std::make_unique<Model3434>();
      case 2: return std::make_unique<Model8295>();
      default: return nullptr;
    }
}

int main() {
    auto car1 = createCar(1);
    auto car2 = createCar(2);
}

我使用了 unique_ptr 而不是原始指针,因为我认为拥有指针是一种很好的做法,但它应该大致相同。

将枚举而不是整数传递给您的工厂函数可能更可取。

另外,将工厂函数放在命名空间中可能值得,最好与 Car 位于同一命名空间中,以避免污染全局命名空间。

关于c++ - 隐藏代码选择Interface类的Derived类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26885532/

相关文章:

c++ - 基于范围的 For 循环和 ADL

c++ - 递增序列 C++

c++ - 继承接口(interface)时未解析的符号

java - 检查类或接口(interface)实现或扩展特定接口(interface)

安卓BetterPickers

c++ - C++中如何获取executor的路径?

c++ - 使用指针将 char* 转换为 unsigned char*

iOS:自定义按钮未显示在 Storyboard 上

Java Class.newInstance 错误

python - 定义 3-D 空间中变换估计的精度