程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 高質量C++/C編程指南-第10章-類的繼承與組合(2)

高質量C++/C編程指南-第10章-類的繼承與組合(2)

編輯:關於C++

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派生而成

一只公雞使勁地追打一只剛下了蛋的母雞,你知道為什麼嗎?

因為母雞下了鴨蛋。

很多程序員經不起“繼承”的誘惑而犯下設計錯誤。“運行正確”的程序不見得是高質量的程序,此處就是一個例證。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved