【Exceptional C++(11)】Classes之间的关
2018-01-29 本文已影响3人
downdemo
问题
- 一个网络程序有两种通信行为,每种行为有自己的协议规定,两个规定之间有一些相似之处,某程序员设计如下,将共同运算和信息封装在BasicProtocal class中
class BasicProtocal {
public:
BasicProtocal();
virtual ~BasicProtocal();
bool BasicMsgA(...);
bool BasicMsgB(...);
bool BasicMsgC(...);
};
class Protocal1 : public BasicProtocal {
public:
Protocal1();
~Protocal1();
bool DoMsg1(...);
bool DoMsg2(...);
bool DoMsg3(...);
bool DoMsg4(...);
};
class Protocal2 : public BasicProtocal {
public:
Protocal2();
~Protocal2();
bool DoMsg1(...);
bool DoMsg2(...);
bool DoMsg3(...);
bool DoMsg4(...);
bool DoMsg5(...);
};
- 每个DoMsg...()都调用BasicProtocal::Basic...()执行共同工作,然后再执行实际传送工作。此设计有需要改进的地方吗?
解答
- 这是一个十分常见的OO class关系上错误设计,这是一个很明显的is implemented in terms of关系,这种关系应该使用private继承或membership实现。但是希望塑模is implemented in terms of关系时,选择membership/aggregation而不要用private继承,除非需要存取protected成员或重写虚函数