我应该使用啥设计模式来避免这里的虚拟代码?
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能上外网,主机可以连接虚拟机,但是虚拟机不能连接主机是啥原因
在终端里,使用ftp命令,如何进入主动模式,具体应该输入啥指令