| 導購 | 订阅 | 在线投稿
分享
 
 
 

將面向對象的思想貫穿始終--談Delphi開發(第三篇)

來源:互聯網網民  2006-05-27 08:02:24  評論

繼承和多態是密切相關的。Object Pascal引入了一種多態的機制,叫重載(Overload),它的思想與面向對象關系不大,這裏不作討論。與面向對象思想密切相關的多態是我們著重要討論的。

多態依賴于抽象方法以及虛方法的概念,同時也和繼承密切相關。以爲我們往往定義一些底層的對象,然後將其某些實現定義爲抽象的,也就是說我們僅僅定義了接口,而沒有定義具體的實現細節。按照這樣的思路,我們還會定義多個派生(繼承)的對象,在這些對象中真正實現那些在祖先類中未曾實現的細節。這就使得我們先前定義的底層類,具有多態的特性。這種機制的好處在于,我們使用這些類的時候,只要一套代碼,就可以完成多種功能。而唯一需要改變的就是創建對象的實例的那一部分。

觀察這樣的一個類:

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方法是純虛函數。這表明TStream這個類並不能被真正使用(不能創建該類的實例),它只是一個類似于接口的類,它定義了作爲TStream類應當具備以及需要處理的基本功能。而且它還規定,其他從TStream類派生出的類,必須去實現的功能(如Read以及Write等)。

舉例來說,TFileStream,以磁盤文件應用的方式實現了TStream類;而TMemoryStream則以內存應用的方式實現了TStream類。現在假設有一個類TMyClass提供一個SaveToStream的方法:

TMyClass = Class(TObject)

procedure SaveToStream(Stream: TStream);

end;

則應用多態的思想,可以有這樣的代碼:

var

strm: TStream;

MyClass: TMyClass;

begin

strm := TFileStream.Create(『abc.txt』); // ? 此處Stream的真正實例類型是TFileStream

MyClass := TMyClass.Create;

MyClass.SaveToStream(strm);

…..

end;

而要將MyClass的內容存放到內存中,只需改變

strm := TFileStream.Create(『abc.txt』);

爲:

strm := TMemoryStream.Create;

即可。

多態的使用是需要兩方面的工作,其一當然是類的構架中考慮到了多態,能夠提供實現某種功能的中間類(抽象類);其二,是懂得去運用這些中間類,這個工作體現在定義一些過程,函數的參數上。

另外很重要的一點,我想提醒大家的是,類的規劃是很重要的,在面向對象編程的時代,類的框架很大程度上決定了程序的框架,決定了軟件開發的成敗。結構清楚,層次分明的類構架,不僅易于功能劃分與擴展,同時也更易于代碼的維護。而在這之中,應用繼承和多態的思想,引入抽象類,引入中間類,是較爲可取的一種方法。

以下列出Delphi中提供的一部分抽象類與具體類:

抽象類 派生的具體類

TStream TFileStream,TMemoryStream;

TCustomIniFile TIniFile, TMemIniFile,TRegistryIniFile;

TStrings TStringList,TMemoStrings,TListBoxStrings;

還有很多,等待你我去發現。這裏最常用的是TStream,而最令我驚異的是TCustomIniFile,它的TRegistryIniFile允許你用訪問IniFile的方式來訪問注冊表!這使得我可以用一套代碼,實現寫注冊表和寫Ini文件的功能。這其中的技術雖然簡單,但是它的意義非同凡響!

[url=http://www.csdn.net/develop/my_article.asp?author=Musicwind][/url]

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
繼承和多態是密切相關的。Object Pascal引入了一種多態的機制,叫重載(Overload),它的思想與面向對象關系不大,這裏不作討論。與面向對象思想密切相關的多態是我們著重要討論的。 多態依賴于抽象方法以及虛方法的概念,同時也和繼承密切相關。以爲我們往往定義一些底層的對象,然後將其某些實現定義爲抽象的,也就是說我們僅僅定義了接口,而沒有定義具體的實現細節。按照這樣的思路,我們還會定義多個派生(繼承)的對象,在這些對象中真正實現那些在祖先類中未曾實現的細節。這就使得我們先前定義的底層類,具有多態的特性。這種機制的好處在于,我們使用這些類的時候,只要一套代碼,就可以完成多種功能。而唯一需要改變的就是創建對象的實例的那一部分。 觀察這樣的一個類: 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方法是純虛函數。這表明TStream這個類並不能被真正使用(不能創建該類的實例),它只是一個類似于接口的類,它定義了作爲TStream類應當具備以及需要處理的基本功能。而且它還規定,其他從TStream類派生出的類,必須去實現的功能(如Read以及Write等)。 舉例來說,TFileStream,以磁盤文件應用的方式實現了TStream類;而TMemoryStream則以內存應用的方式實現了TStream類。現在假設有一個類TMyClass提供一個SaveToStream的方法: TMyClass = Class(TObject) procedure SaveToStream(Stream: TStream); end; 則應用多態的思想,可以有這樣的代碼: var strm: TStream; MyClass: TMyClass; begin strm := TFileStream.Create(『abc.txt』); // ? 此處Stream的真正實例類型是TFileStream MyClass := TMyClass.Create; MyClass.SaveToStream(strm); ….. end; 而要將MyClass的內容存放到內存中,只需改變 strm := TFileStream.Create(『abc.txt』); 爲: strm := TMemoryStream.Create; 即可。 多態的使用是需要兩方面的工作,其一當然是類的構架中考慮到了多態,能夠提供實現某種功能的中間類(抽象類);其二,是懂得去運用這些中間類,這個工作體現在定義一些過程,函數的參數上。 另外很重要的一點,我想提醒大家的是,類的規劃是很重要的,在面向對象編程的時代,類的框架很大程度上決定了程序的框架,決定了軟件開發的成敗。結構清楚,層次分明的類構架,不僅易于功能劃分與擴展,同時也更易于代碼的維護。而在這之中,應用繼承和多態的思想,引入抽象類,引入中間類,是較爲可取的一種方法。 以下列出Delphi中提供的一部分抽象類與具體類: 抽象類 派生的具體類 TStream TFileStream,TMemoryStream; TCustomIniFile TIniFile, TMemIniFile,TRegistryIniFile; TStrings TStringList,TMemoStrings,TListBoxStrings; 還有很多,等待你我去發現。這裏最常用的是TStream,而最令我驚異的是TCustomIniFile,它的TRegistryIniFile允許你用訪問IniFile的方式來訪問注冊表!這使得我可以用一套代碼,實現寫注冊表和寫Ini文件的功能。這其中的技術雖然簡單,但是它的意義非同凡響! [url=http://www.csdn.net/develop/my_article.asp?author=Musicwind][/url]
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有