面向?qū)ο笙到y(tǒng)最突出的特性就是封裝性、繼承性和多態(tài)性。衡量某一種程序設(shè)計(jì)語言,看它是否是面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,主要看它是否具有這三種特性。在這一章中我們將對(duì)它們逐個(gè)地進(jìn)行分析。
3.1 封 裝 性
3.1.1 什么是封裝
從字面上理解,封裝就是將某事物包圍起來,使外界不知道其實(shí)際內(nèi)容。
在程序設(shè)計(jì)中,封裝是指將一個(gè)數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合放在一起,形成一個(gè)能動(dòng)的實(shí)體 ---- 對(duì)象,用戶不必知道對(duì)象行為的實(shí)現(xiàn)細(xì)節(jié),只需根據(jù)對(duì)象提供的外部特性接口訪問對(duì)象即可。因此,從用戶的觀點(diǎn)來看,這些對(duì)象的行為就像包含在一個(gè)“黑匣子”里,是隱蔽的、看不見的。
從上面的敘述我們看出,封裝應(yīng)該具有下面幾個(gè)條件:
①具有一個(gè)清楚的邊界,對(duì)象的所有私有數(shù)據(jù)、內(nèi)部程序(成員函數(shù))細(xì)節(jié)都被固定在這個(gè)邊界內(nèi)。
②具有一個(gè)接口,這個(gè)接口描述了對(duì)象之間的相互作用、請(qǐng)求和響應(yīng),它就是消息。
③對(duì)象內(nèi)部的實(shí)現(xiàn)代碼受到封裝殼的保護(hù),其它對(duì)象不能直接修改本對(duì)象所擁有的數(shù)據(jù)和代碼。
3.1.2 什么是協(xié)議
協(xié)議是一個(gè)對(duì)象對(duì)外服務(wù)的說明,它聲明這個(gè)對(duì)象可以為外界做什么。它是由一個(gè)對(duì)象能夠接受并且愿意接受的所有信息構(gòu)成的對(duì)外接口。也就是說,請(qǐng)求對(duì)象進(jìn)行操作的途徑就是通過協(xié)議中提供的消息進(jìn)行的。
例如,一個(gè)人有各種能力,其中有一部分能力他樂意向外界公布并對(duì)外界提供服務(wù);還有部分能力只是有選擇地向某些人宣布;還有一部分能力他不想讓任何人知道,即使外人知道了他所具有的這部分能力,他也不向他提供服務(wù)。這里就存在一個(gè)協(xié)議的問題,我們可以將能夠提供服務(wù)的那部分能力寫到協(xié)議中去。
外界對(duì)象能夠并且只能根據(jù)該對(duì)象發(fā)送協(xié)議中所提供的消息,請(qǐng)求該對(duì)象服務(wù)。即使一個(gè)對(duì)象可以完成某一功能,但它沒有將該功能放入?yún)f(xié)議中去,外界對(duì)象依然不能請(qǐng)求它完成這一功能。協(xié)議實(shí)際上是一個(gè)對(duì)象所能接受的所有公有消息的集合。
下面是一個(gè)用C++語言所定義的對(duì)象類:
class student{
private:
char * name;
int mark;
char *major;
vOid changemark();
protected:
int getmark,();
public:
char *getname();
char *getmajor();
};
在上面所定義的學(xué)生對(duì)象類中,包含的數(shù)據(jù)內(nèi)容有學(xué)生姓名、分?jǐn)?shù)、專業(yè)。
它所包含的操作(所具有的功能)分為三種:
①處于私有段(private)的changemark,這是不向外界公開的功能,只供對(duì)象自己使用。
②處于保護(hù)段(protected)的getmark,這是只向部分外界宣布的功能,只對(duì)其派生類對(duì)象提供服務(wù)。
③處于公有段(public)的getname和getmajor,這是向所有外界公開的功能,它可以響應(yīng)外界對(duì)象的請(qǐng)求,這些是屬于協(xié)議的內(nèi)容。
3.1.3 面向?qū)ο笙到y(tǒng)的封裝性
面向?qū)ο笙到y(tǒng)的封裝性是一種信息隱藏技術(shù),它使系統(tǒng)設(shè)計(jì)員能夠清楚地標(biāo)明他們所提供的服務(wù)界面,用戶和應(yīng)用程序員則只看見對(duì)象提供的操作功能,看不到其中的數(shù)據(jù)或操作代碼細(xì)節(jié)。
從用戶或應(yīng)用程序員的角度看,對(duì)象提供了一組服務(wù),而服務(wù)的具體實(shí)現(xiàn)即對(duì)象的內(nèi)部卻被屏蔽封裝著。
對(duì)象的這一封裝機(jī)制的目的在于將對(duì)象的使用者與設(shè)計(jì)者分開,使用者不必知道對(duì)象行為實(shí)現(xiàn)的細(xì)節(jié),只需用設(shè)計(jì)者提供的協(xié)議命令對(duì)象去做即可。
面向?qū)ο笙到y(tǒng)中的封裝單位為對(duì)象,即主要指對(duì)對(duì)象的封裝,該對(duì)象的特性是由它所屬的類說明來描述。除去對(duì)象的封裝以外,類概念本身也具有一種封裝意義,它將數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合封裝在一起,建立了一個(gè)定義良好的接口,這反映了抽象數(shù)據(jù)類型的思想。
3.2 繼 承 性
3.2.1 繼承的引入
繼承是面向?qū)ο笙到y(tǒng)中的另一個(gè)重要的概念。在前面,我們討論了類,這些類是孤立的,相互之間還沒有建立關(guān)系,也就是說,這些類都處在同一級(jí)別上,是一種平坦結(jié)構(gòu)。而這種沒有相交關(guān)系的平坦結(jié)構(gòu)限制了面向?qū)ο笙到y(tǒng)的設(shè)計(jì),這是因?yàn)樗辉试S類之間實(shí)現(xiàn)信息共享。在系統(tǒng)中有些對(duì)象,它們有一些相同但又有些差別,如果不允許類之間建立相交關(guān)系,這些不同對(duì)象的相似之處就無法表現(xiàn)出來。
3.1 封 裝 性
3.1.1 什么是封裝
從字面上理解,封裝就是將某事物包圍起來,使外界不知道其實(shí)際內(nèi)容。
在程序設(shè)計(jì)中,封裝是指將一個(gè)數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合放在一起,形成一個(gè)能動(dòng)的實(shí)體 ---- 對(duì)象,用戶不必知道對(duì)象行為的實(shí)現(xiàn)細(xì)節(jié),只需根據(jù)對(duì)象提供的外部特性接口訪問對(duì)象即可。因此,從用戶的觀點(diǎn)來看,這些對(duì)象的行為就像包含在一個(gè)“黑匣子”里,是隱蔽的、看不見的。
從上面的敘述我們看出,封裝應(yīng)該具有下面幾個(gè)條件:
①具有一個(gè)清楚的邊界,對(duì)象的所有私有數(shù)據(jù)、內(nèi)部程序(成員函數(shù))細(xì)節(jié)都被固定在這個(gè)邊界內(nèi)。
②具有一個(gè)接口,這個(gè)接口描述了對(duì)象之間的相互作用、請(qǐng)求和響應(yīng),它就是消息。
③對(duì)象內(nèi)部的實(shí)現(xiàn)代碼受到封裝殼的保護(hù),其它對(duì)象不能直接修改本對(duì)象所擁有的數(shù)據(jù)和代碼。
3.1.2 什么是協(xié)議
協(xié)議是一個(gè)對(duì)象對(duì)外服務(wù)的說明,它聲明這個(gè)對(duì)象可以為外界做什么。它是由一個(gè)對(duì)象能夠接受并且愿意接受的所有信息構(gòu)成的對(duì)外接口。也就是說,請(qǐng)求對(duì)象進(jìn)行操作的途徑就是通過協(xié)議中提供的消息進(jìn)行的。
例如,一個(gè)人有各種能力,其中有一部分能力他樂意向外界公布并對(duì)外界提供服務(wù);還有部分能力只是有選擇地向某些人宣布;還有一部分能力他不想讓任何人知道,即使外人知道了他所具有的這部分能力,他也不向他提供服務(wù)。這里就存在一個(gè)協(xié)議的問題,我們可以將能夠提供服務(wù)的那部分能力寫到協(xié)議中去。
外界對(duì)象能夠并且只能根據(jù)該對(duì)象發(fā)送協(xié)議中所提供的消息,請(qǐng)求該對(duì)象服務(wù)。即使一個(gè)對(duì)象可以完成某一功能,但它沒有將該功能放入?yún)f(xié)議中去,外界對(duì)象依然不能請(qǐng)求它完成這一功能。協(xié)議實(shí)際上是一個(gè)對(duì)象所能接受的所有公有消息的集合。
下面是一個(gè)用C++語言所定義的對(duì)象類:
class student{
private:
char * name;
int mark;
char *major;
vOid changemark();
protected:
int getmark,();
public:
char *getname();
char *getmajor();
};
在上面所定義的學(xué)生對(duì)象類中,包含的數(shù)據(jù)內(nèi)容有學(xué)生姓名、分?jǐn)?shù)、專業(yè)。
它所包含的操作(所具有的功能)分為三種:
①處于私有段(private)的changemark,這是不向外界公開的功能,只供對(duì)象自己使用。
②處于保護(hù)段(protected)的getmark,這是只向部分外界宣布的功能,只對(duì)其派生類對(duì)象提供服務(wù)。
③處于公有段(public)的getname和getmajor,這是向所有外界公開的功能,它可以響應(yīng)外界對(duì)象的請(qǐng)求,這些是屬于協(xié)議的內(nèi)容。
3.1.3 面向?qū)ο笙到y(tǒng)的封裝性
面向?qū)ο笙到y(tǒng)的封裝性是一種信息隱藏技術(shù),它使系統(tǒng)設(shè)計(jì)員能夠清楚地標(biāo)明他們所提供的服務(wù)界面,用戶和應(yīng)用程序員則只看見對(duì)象提供的操作功能,看不到其中的數(shù)據(jù)或操作代碼細(xì)節(jié)。
從用戶或應(yīng)用程序員的角度看,對(duì)象提供了一組服務(wù),而服務(wù)的具體實(shí)現(xiàn)即對(duì)象的內(nèi)部卻被屏蔽封裝著。
對(duì)象的這一封裝機(jī)制的目的在于將對(duì)象的使用者與設(shè)計(jì)者分開,使用者不必知道對(duì)象行為實(shí)現(xiàn)的細(xì)節(jié),只需用設(shè)計(jì)者提供的協(xié)議命令對(duì)象去做即可。
面向?qū)ο笙到y(tǒng)中的封裝單位為對(duì)象,即主要指對(duì)對(duì)象的封裝,該對(duì)象的特性是由它所屬的類說明來描述。除去對(duì)象的封裝以外,類概念本身也具有一種封裝意義,它將數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合封裝在一起,建立了一個(gè)定義良好的接口,這反映了抽象數(shù)據(jù)類型的思想。
3.2 繼 承 性
3.2.1 繼承的引入
繼承是面向?qū)ο笙到y(tǒng)中的另一個(gè)重要的概念。在前面,我們討論了類,這些類是孤立的,相互之間還沒有建立關(guān)系,也就是說,這些類都處在同一級(jí)別上,是一種平坦結(jié)構(gòu)。而這種沒有相交關(guān)系的平坦結(jié)構(gòu)限制了面向?qū)ο笙到y(tǒng)的設(shè)計(jì),這是因?yàn)樗辉试S類之間實(shí)現(xiàn)信息共享。在系統(tǒng)中有些對(duì)象,它們有一些相同但又有些差別,如果不允許類之間建立相交關(guān)系,這些不同對(duì)象的相似之處就無法表現(xiàn)出來。