這一段時間關於多態的討論可謂一浪高過一浪,各位大蝦都有高論出爐。本人也按奈不住,所以結合一下本人的工作實際,談談多態的應用問題。
在我做系統的早期所應用的多態情況較少,多是出現這樣一些用到多態的情況
var
s : TStrings;
begin
s := TStringList.Create;
try
s.Add('hello!');
....
finally
s.free;
end;
end;
上面這段程序可能在很多人的源程序中都出現過,而且以"TStringList.add"來搜Delphi的help可以看到類似的例子。對於TStrings由於其方法create是abstract所以不能直接使用必須使用其子類的Create方法。這裡就是把子類(TStringList)的對象實例賦給定義的父類(TStrings)對象;而Add在TStrings中是被聲明為virtual的,那麼根據多態的特性s對象在使用Add方法時會調用其創建時所使用的類型(TStringList)的方法而不是TStrings。
這裡還是體現不出多態的好處,那麼就拿我做過的一個表格系統為例子吧。做這個系統的時候要求做一系列表格,基本上是一個表格一個Form如:TgridForm1,TgridForm2...,然後這些Form內嵌在外部的一個TContainerForm中,由TContainerForm調用所有表格Form的方法如存盤(save).到這裡都沒有問題,很簡單。注意現在問題來了。系統要求每一個表格Form獨立打包,而且程序開發過後會不斷的加入新的未知的表格Form,但不允許將整個程序重新codeing和compile,對於最終用戶來說只要down一個新的包含這個表格的包就能使用新的表格。這時多態的強大作用就發揮出來了。我是這麼做的,做一個TParentgridForm一個所有表格Form的父類,它定義了所有可能的方法(如:save),當然是Virtual的。這時各個表格Form根據業務要求自行實現Save等方法。 對於TContainerForm來說它只知道TParentgridForm不知道具體的表格Form但是由於多態的作用,當TContainerForm在調用內嵌在它裡面的Form的Save方法時會正確的調用各個表格Form的Save方法,這樣各個表格的業務邏輯就實現了。而且以後不管加多少個新的表格,TContainerForm都會實現其正確功能,並且勿需重新Compile整個系統了。哈哈,有點對象插件的味道。
可見如果大家善於利用多態的話,在現實的編程中會享受到其極大的好處。特別是對於上面這種靈活度要求很高的系統。
哈哈講了這麼多不知道大家明白不。