国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

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

2019-11-17 05:19:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  對(duì)象(Object)是類(Class)的一個(gè)實(shí)例(Instance)。假如將對(duì)象比作房子,那么類就是房子的設(shè)計(jì)圖紙。所以面向?qū)ο笤O(shè)計(jì)的重點(diǎn)是類的設(shè)計(jì),而不是對(duì)象的設(shè)計(jì)。 對(duì)于C++程序而言,設(shè)計(jì)孤立的類是比較輕易的,難的是正確設(shè)計(jì)基類及其派生類。本章僅僅論述“繼續(xù)”(Inheritance)和“組合”(Composition)的概念。注重,當(dāng)前面向?qū)ο蠹夹g(shù)的應(yīng)用熱點(diǎn)是COM和CORBA,這些內(nèi)容超出了C++教材的范疇,請(qǐng)閱讀COM和CORBA相關(guān)論著。10.1 繼續(xù)
假如A是基類,B是A的派生類,那么B將繼續(xù)A的數(shù)據(jù)和函數(shù)。例如:class A{public:void Func1(void);void Func2(void);};class B : public A{public:void Func3(void);void Func4(void);};main(){B b; b.Func1(); // B從A繼續(xù)了函數(shù)Func1b.Func2(); // B從A繼續(xù)了函數(shù)Func2b.Func3();b.Func4();}這個(gè)簡(jiǎn)單的示例程序說(shuō)明了一個(gè)事實(shí):C++的“繼續(xù)”特性可以提高程序的可復(fù)用性。正因?yàn)椤袄^續(xù)”太有用、太輕易用,才要防止亂用“繼續(xù)”。我們應(yīng)當(dāng)給“繼續(xù)”立一些使用規(guī)則。l 【規(guī)則10-1-1】假如類A和類B毫不相關(guān),不可以為了使B的功能更多些而讓B繼續(xù)A的功能和屬性。不要覺(jué)得“白吃白不吃”,讓一個(gè)好端端的健壯青年無(wú)緣無(wú)故地吃人參補(bǔ)身體。l 【規(guī)則10-1-2】若在邏輯上B是A的“一種”(a kind of ),則答應(yīng)B繼續(xù)A的功能和屬性。例如男人(Man)是人(Human)的一種,男孩(Boy)是男人的一種。那么類Man可以從類Human派生,類Boy可以從類Man派生。class Human{…};class Man : public Human{…};class Boy : public Man{…};u 注重事項(xiàng)【規(guī)則10-1-2】看起來(lái)很簡(jiǎn)單,但是實(shí)際應(yīng)用時(shí)可能會(huì)有意外,繼續(xù)的概念在程序世界與現(xiàn)實(shí)世界并不完全相同。例如從生物學(xué)角度講,鴕鳥(niǎo)(Ostrich)是鳥(niǎo)(Bird)的一種,按理說(shuō)類Ostrich應(yīng)該可以從類Bird派生。但是鴕鳥(niǎo)不能飛,那么Ostrich::Fly是什么東西?class Bird{public: virtual void Fly(void);…};class Ostrich : public Bird{…};例如從數(shù)學(xué)角度講,圓(Circle)是一種非凡的橢圓(Ellipse),按理說(shuō)類Circle應(yīng)該可以從類Ellipse派生。但是橢圓有長(zhǎng)軸和短軸,假如圓繼續(xù)了橢圓的長(zhǎng)軸和短軸,豈非畫(huà)蛇添足?所以更加嚴(yán)格的繼續(xù)規(guī)則應(yīng)當(dāng)是:若在邏輯上B是A的“一種”,并且A的所有功能和屬性對(duì)B而言都有意義,則答應(yīng)B繼續(xù)A的功能和屬性。10.2 組合
l 【規(guī)則10-2-1】若在邏輯上A是B的“一部分”(a part of),則不答應(yīng)B從A派生,而是要用A和其它東西組合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是頭(Head)的一部分,所以類Head應(yīng)該由類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); };

// 正確的設(shè)計(jì),雖然代碼冗長(zhǎng)。 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組合而成假如答應(yīng)Head從Eye、Nose、Mouth、Ear派生而成,那么Head將自動(dòng)具有Look、 Smell、Eat、Listen這些功能。示例10-2-2十分簡(jiǎn)短并且運(yùn)行正確,但是這種設(shè)計(jì)方法卻是不對(duì)的。// 功能正確并且代碼簡(jiǎn)潔,但是設(shè)計(jì)方法不對(duì)。class Head : public Eye, public Nose, public Mouth, public Ear{};
示例10-2-2 Head從Eye、Nose、Mouth、Ear派生而成一只公雞使勁地追打一只剛下了蛋的母雞,你知道為什么嗎?因?yàn)槟鸽u下了鴨蛋。很多程序員經(jīng)不起“繼續(xù)”的誘惑而犯下設(shè)計(jì)錯(cuò)誤。“運(yùn)行正確”的程序不見(jiàn)得是高質(zhì)量的程序,此處就是一個(gè)例證。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永清县| 津南区| 区。| 桐梓县| 六盘水市| 出国| 萝北县| 长沙市| 东乡| 花垣县| 平安县| 同德县| 柳州市| 龙州县| 屏南县| 汾阳市| 崇信县| 赣州市| 石嘴山市| 开江县| 四平市| 奉贤区| 布拖县| 克什克腾旗| 西安市| 禄劝| 兴城市| 敦化市| 黎平县| 镇雄县| 美姑县| 广东省| 盐源县| 竹山县| 彭泽县| 扎鲁特旗| 梁平县| 晋城| 南昌市| 华安县| 延津县|