(《將面向對象的思想貫穿始終-談Delphi開發》之第三篇)
前兩篇討論的是有關封裝性的話題。這裡,想和您說說關於繼承和多態。
繼承和多態是密切相關的。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’); //