(《將面向?qū)ο蟮乃枷胴灤┦冀K-談Delphi開發(fā)》之第三篇)
前兩篇討論的是有關(guān)封裝性的話題。這里,想和您說說關(guān)于繼承和多態(tài)。
繼承和多態(tài)是密切相關(guān)的。Object Pascal引入了一種多態(tài)的機(jī)制,叫重載(Overload),它的思想與面向?qū)ο箨P(guān)系不大,這里不作討論。與面向?qū)ο笏枷朊芮邢嚓P(guān)的多態(tài)是我們著重要討論的。
多態(tài)依賴于抽象方法以及虛方法的概念,同時(shí)也和繼承密切相關(guān)。以為我們往往定義一些底層的對(duì)象,然后將其某些實(shí)現(xiàn)定義為抽象的,也就是說我們僅僅定義了接口,而沒有定義具體的實(shí)現(xiàn)細(xì)節(jié)。按照這樣的思路,我們還會(huì)定義多個(gè)派生(繼承)的對(duì)象,在這些對(duì)象中真正實(shí)現(xiàn)那些在祖先類中未曾實(shí)現(xiàn)的細(xì)節(jié)。這就使得我們先前定義的底層類,具有多態(tài)的特性。這種機(jī)制的好處在于,我們使用這些類的時(shí)候,只要一套代碼,就可以完成多種功能。而唯一需要改變的就是創(chuàng)建對(duì)象的實(shí)例的那一部分。
觀察這樣的一個(gè)類:
TStream = class(TObject)
……
public
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
……
end;
virual以及abstract保留字表明了Read以及Write方法是純虛函數(shù)。這表明TStream這個(gè)類并不能被真正使用(不能創(chuàng)建該類的實(shí)例),它只是一個(gè)類似于接口的類,它定義了作為TStream類應(yīng)當(dāng)具備以及需要處理的基本功能。而且它還規(guī)定,其他從TStream類派生出的類,必須去實(shí)現(xiàn)的功能(如Read以及Write等)。
舉例來說,TFileStream,以磁盤文件應(yīng)用的方式實(shí)現(xiàn)了TStream類;而TMemoryStream則以內(nèi)存應(yīng)用的方式實(shí)現(xiàn)了TStream類。現(xiàn)在假設(shè)有一個(gè)類TMyClass提供一個(gè)SaveToStream的方法:
TMyClass = Class(TObject)
PRocedure SaveToStream(Stream: TStream);
end;
則應(yīng)用多態(tài)的思想,可以有這樣的代碼:
var
strm: TStream;
MyClass: TMyClass;
begin
strm := TFileStream.Create(‘a(chǎn)bc.txt’); // ß 此處Stream的真正實(shí)例類型是TFileStream
MyClass := TMyClass.Create;
MyClass.SaveToStream(strm);
…..
end;
而要將MyClass的內(nèi)容存放到內(nèi)存中,只需改變
strm := TFileStream.Create(‘a(chǎn)bc.txt’);
為:
strm := TMemoryStream.Create;
即可。
多態(tài)的使用是需要兩方面的工作,其一當(dāng)然是類的構(gòu)架中考慮到了多態(tài),能夠提供實(shí)現(xiàn)某種功能的中間類(抽象類);其二,是懂得去運(yùn)用這些中間類,這個(gè)工作體現(xiàn)在定義一些過程,函數(shù)的參數(shù)上。
另外很重要的一點(diǎn),我想提醒大家的是,類的規(guī)劃是很重要的,在面向?qū)ο缶幊痰臅r(shí)代,類的框架很大程度上決定了程序的框架,決定了軟件開發(fā)的成敗。結(jié)構(gòu)清楚,層次分明的類構(gòu)架,不僅易于功能劃分與擴(kuò)展,同時(shí)也更易于代碼的維護(hù)。而在這之中,應(yīng)用繼承和多態(tài)的思想,引入抽象類,引入中間類,是較為可取的一種方法。
以下列出Delphi中提供的一部分抽象類與具體類:
抽象類 派生的具體類
TStream TFileStream,TMemoryStream;
TCustomIniFile TIniFile, TMemIniFile,TRegistryIniFile;
TStrings TStringList,TMemoStrings,TListBoxStrings;
還有很多,等待你我去發(fā)現(xiàn)。這里最常用的是TStream,而最令我驚異的是TCustomIniFile,它的TRegistryIniFile允許你用訪問IniFile的方式來訪問注冊(cè)表!這使得我可以用一套代碼,實(shí)現(xiàn)寫注冊(cè)表和寫Ini文件的功能。這其中的技術(shù)雖然簡(jiǎn)單,但是它的意義非同凡響!
(未完,待續(xù))
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注