【问题标题】:Common design interface for child classes of base class c++基类c++子类的通用设计接口
【发布时间】:2016-05-18 18:50:42
【问题描述】:

我有虚拟课程 Car。 从这个类有不同的子类。

在我的界面中,我有函数

   ride(std::string type = "mercedes")

函数采用参数类型,并基于此决定实例化哪辆车并执行骑行。 目前,我执行以下操作:

ride(std::string type = "mercedes")
{
  if(type =="btw")
{
  auto car = std::make_shared<BMW>();
  car.ride();

}
else if(type =="audi")
{
  auto car = std::make_shared<Audi>();
  car.ride();
}
 default
{
  auto car = std::make_shared<Mercedes >();
  car.ride();
}
}

在 if-else-loop 之前实例化 Car 的方法是什么,然后只分配正确的类型?

非常感谢!

【问题讨论】:

  • ride 函数不应该负责创建派生实例。这就是工厂的用途。将字符串转换为特定的 Car 实例是一项职责。
  • Car 派生每个制造商似乎很愚蠢。我只需要一个Car 类,让它将其品牌和型号存储为std::string 数据成员。

标签: c++ class user-interface interface


【解决方案1】:

我认为你应该使用工厂方法来实例化基于模型的派生类,然后使用基指针调用派生方法(ride())。

Car{
public:
  static Car* Factory(std::string type = "mercedes") {
  if( type == "mercedes")
    return std::make_shared<Mercedes>();
  else if( type == "bmw" ) 
    return std::make_shared<BMW>();
  }
  virtual int ride();
}

用法:

Car *car = Car::Factory("mercedes");
car->ride();

【讨论】:

  • OP 使用的是 C++11; override 是一个安全的选择。
  • 如果我的课程是模板课程,那仍然有效吗?
  • @chris:同意。删除了覆盖。
  • @user298182 使用模板的类没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多