假设我有一个像
这样的接口(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/