我应该使用啥设计模式来避免这里的虚拟代码?

Posted

技术标签:

【中文标题】我应该使用啥设计模式来避免这里的虚拟代码?【英文标题】: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; 【参考方案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;

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

【讨论】:

以上是关于我应该使用啥设计模式来避免这里的虚拟代码?的主要内容,如果未能解决你的问题,请参考以下文章

我设置了桥接模式,centos7能上外网,主机可以连接虚拟机,但是虚拟机不能连接主机是啥原因

虚拟机中IDE磁盘和SDSI磁盘有啥区别

响应式网站设计

在终端里,使用ftp命令,如何进入主动模式,具体应该输入啥指令

为了避免在库代码中引发“FE_INEXACT”,我应该采取啥措施?

我可以使用啥图表来显示 Html 事件和操作