再談多型--多型的應用舉例: (轉)

gugu99發表於2008-07-11
再談多型--多型的應用舉例: (轉)[@more@]
再談多型--多型的應用舉例:
  這一段時間關於多型的討論可謂一浪高過一浪,各位大蝦都有高論出爐。本人也按奈不住,所以結合一下本人的工作實際,談談多型的應用問題。
  在我做的早期所應用的多型情況較少,多是出現這樣一些用到多型的情況
var
  s : TStrings;
begin
  s := TStringList.Create;
  try
  s.Add('hello!');
  ....
  finally
  s.free;
  end;
end;
上面這段可能在很多人的源程式中都出現過,而且以"TStringList.add"來搜的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整個系統了。哈哈,有點物件的味道。
  可見如果大家善於利用多型的話,在現實的中會享受到其極大的好處。特別是對於上面這種靈活度要求很高的系統。
  哈哈講了這麼多不知道大家明白不。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007119/,如需轉載,請註明出處,否則將追究法律責任。

相關文章