【问题标题】:What design pattern should I use to avoid dummy code here?我应该使用什么设计模式来避免这里的虚拟代码?
【发布时间】:2014-11-03 12:26:14
【问题描述】:

我有一个基类 -

class content
{

private:
  int m_data;

public:

  int getdbhandle() { return m_sql_db; }

  void setData(int data) { m_data = data; }

  virtual int getterrestrialServices { qDebug()"This is a dummy interface"; }

};


class telecontent: public content
{

   virtual int getterrestrialServices { qDebug()" Real implementation here"; }

};

现在,当产品类型为远程时,课程内容被实例化为远程内容。 然而,当产品类型是通用的 - 虚拟界面打印不断出现。 我怎样才能避免这种情况?是否有任何设计模式强制基类不实现虚拟函数?我想要一种有效的方法,以便只有派生类才有方法。我不希望基类具有该方法。但是,我无法修改调用者 - 代码 - 以便不调用该方法。我想要策略性设计的最佳方式,以避免虚拟接口。

【问题讨论】:

  • 你为什么不把它变成纯虚拟的?
  • 不要忘记虚拟析构函数。
  • 你可以像这样使用纯虚函数virtual int getterrestrialServices() = 0;

标签: c++ design-patterns


【解决方案1】:

是否有任何设计模式强制基类不 实现虚拟函数?

纯虚拟允许这样做:

class content
{

private:
  int m_data;

public:
  virtual ~content() { }
  int getdbhandle() { return m_sql_db; }

  void setData(int data) { m_data = data; }

  virtual int getterrestrialServices() = 0; // pure virtual

};

这意味着没有人可以创建内容实例(将导致编译器错误),因此当有人从内容继承时,他们必须提供 getterrestrialServices() 的实现(否则,他们将再次获得编译器错误)。

【讨论】:

  • 但是getterrestrialServices这个方法只对一个派生类有意义,其他派生类根本不需要这个。但是,我只能使用基类类型访问派生类。这就像 Base *telecontentPtr = new telecontent();
  • 这与您的问题不同,纯虚拟会按照您的要求进行。您在评论中陈述的问题是一个损坏的设计,唯一的解决方法是使用 dynamic_cast 来获取一个实现此方法的特定派生类型。
  • @user3629119 - 那么你有一个糟糕的设计。为什么要在代码的通用部分调用高度专业化的函数getrestrialServices
【解决方案2】:

你需要的是像这样的纯虚拟:

virtual int getterrestrialServices() = 0;

它将强制继承内容的每个类都实现它,您将无法创建内容类,只能创建从它继承的类,因此您不会有虚拟打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 2013-06-27
    • 2023-02-10
    • 2017-05-06
    • 1970-01-01
    • 2012-07-15
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多