轉貼 : 偷龍轉鳳的物件設計方法 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼文章 :
http://www25.brinkster.com/hltsai/Articles/LocalExtension.htm
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>偷龍轉鳳的物件設計方法</title>
<style>
<!--
pre { font-family: Courier New }
-->
</style>
</head> <body Verdana">
偷龍轉鳳的物件設計方法作者﹕陳國生日期﹕Jun-7-2002 一般我們設計一個物件,規規矩矩的從VCL下選擇一個最符合本身需求的物計繼承下來,從這個物件開始擴充功能,但有時候這種標準的設計方式,有實際的困難,一者我們手上可能沒有這個物件的Source,二者更改這個物件之後,需考慮原先的物件可能已經在系統中運作,為了不破壞原有的物件功能,及使用的介面,這個時候我們需要一種偷龍轉鳳的方法,偷偷的把這個物件至換掉,要置換這個物件,最好的方法就是產生一個一模一樣的類別出來,而且不改變原有物件的屬性及方法,或者是在原有物件上擴充功能。 以下提供一個另類的設計方法,來解決這個問題。假如有一個TEdit 的物件,我們希望它在修改資料的時候,可以改變顏色,在不改變原有物件的使用介面下,如何來擴充這個功能呢﹖ 請看這個範例的說明﹕ 這個繼承自 TEdit 的 TMyEdit 很簡單的宣告 ReadOnly 這個屬性,其他 Create,Load 的方法,只是要在設計期間取得目前正確的顏色設定而已。 type TMyEdit = class(TEdit) private FDesignColor: TColor; FReadOnly: boolean; procedure SetReadOnly(Value: boolean); procedure SetColor; protected procedure Loaded; override; public constructor Create(AOwner: TComponent); override; published property ReadOnly: boolean read FReadOnly write SetReadOnly; end;接下來我們看 TMyEdit 如何改變原來的屬性,請把焦點放在 SetReadOnly上面,這個 procedrue 動了以下的手腳: 在繼承ReadOnly原有的屬性之後,進行顏色的改變。 procedure TMyEdit.SetReadOnly(Value: boolean); begin FReadOnly:= Value; inherited ReadOnly:= Value; SetColor; end;
constructor TMyEdit.Create(AOwner: TComponent); begin inherited; FDesignColor:= clWindow; end; procedure TMyEdit.Loaded; begin inherited; FDesignColor:= Color; end; procedure TMyEdit.SetColor; begin if ReadOnly then Color:= clBtnFace else Color:= FDesignColor; end; procedure TMyEdit.SetReadOnly(Value: boolean); begin FReadOnly:= Value; inherited ReadOnly:= Value; SetColor; end;寫好這個物件我們開始進行測試,看這個物件如何無聲無息的嵌入我們已經寫好的單元,首先我們拉一個Form1出來,在上面放一個 Edit1 及 Button1,當然您還要建構這個 TMyEdit 的物件,為了方便起見,請將這個單元直接 Copy 到 Form1 所屬的單元裡頭,然後在 Button1 上面,寫入: TMyEdit(Edit1).ReadOnly := False;執行看看,按一下 Button1,這時候 Edit1 的 ReadOnly 是不是多了改變顏色的功能﹖ 結語善用這個方法,可以讓原來的物件繼續工作,甚至還可以擴充新的方法出來,而不必更動原有的物件。你可以參考 Martin Fowler 的 Refactoring 書中關於 Introduce Local Extension 的說明。讀者回應
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind | ||
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
|||
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
synta 兄: 請仔細體會以下這段話: 一般我們設計一個物件,規規矩矩的從VCL下選擇一個最符合本身需求的物計繼承下來,從這個物件開始擴充功能,但有時候這種標準的設計方式,有實際的困難,一者我們手上可能沒有這個物件的Source,二者更改這個物件之後,需考慮原先的物件可能已經在系統中運作... 當初我寫這個範例,是從Refactoring 的觀念來的,這個觀念就是不要去改變現有的東西... 卻又產生可能的擴充空間,而不改變現有,卻是一個最困難的地方... 您覺得呢? 作者:陳國生
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |