首页 / 软件开发 / C++ / 高质量C++/C编程指南-第10章-类的继承与组合(2)
高质量C++/C编程指南-第10章-类的继承与组合(2)2007-05-06林锐10.2 组合
l 【规则10-2-1】若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生而成。如示例10-2-1所示。class Eye{
public:void Look(void); };
class Nose{
public:void Smell(void); };class Mouth{
public:void Eat(void); };
class Ear{
public:void Listen(void); };// 正确的设计,虽然代码冗长。 class Head{public:void Look(void) { m_eye.Look(); }void Smell(void) { m_nose.Smell(); }void Eat(void) { m_mouth.Eat(); }void Listen(void) { m_ear.Listen(); }private:Eye m_eye;Nose m_nose;Mouth m_mouth;Ear m_ear;};示例10-2-1 Head由Eye、Nose、Mouth、Ear组合而成如果允许Head从Eye、Nose、Mouth、Ear派生而成,那么Head将自动具有Look、 Smell、Eat、Listen这些功能。示例10-2-2十分简短并且运行正确,但是这种设计方法却是不对的。// 功能正确并且代码简洁,但是设计方法不对。class Head : public Eye, public Nose, public Mouth, public Ear{};示例10-2-2 Head从Eye、Nose、Mouth、Ear派生而成一只公鸡使劲地追打一只刚下了蛋的母鸡,你知道为什么吗?因为母鸡下了鸭蛋。很多程序员经不起“继承”的诱惑而犯下设计错误。“运行正确”的程序不见得是高质量的程序,此处就是一个例证。