一般我們?cè)O(shè)計(jì)一個(gè)物件,規(guī)規(guī)矩矩的從
VCL
下選擇一個(gè)最符合本身需求的物計(jì)
繼承下來,從這個(gè)物件開始擴(kuò)充功能,但有時(shí)候這種標(biāo)準(zhǔn)的設(shè)計(jì)方式,有實(shí)
際的困難,一者我們手上可能沒有這個(gè)物件的
Source
,二者更改這個(gè)物件之
後,需考慮原先的物件可能已經(jīng)在系統(tǒng)中運(yùn)作,為了不破壞原有的物件功能
,及使用的介面,這個(gè)時(shí)候我們需要一種偷龍轉(zhuǎn)鳳的方法,偷偷的把這個(gè)物
件至換掉,要置換這個(gè)物件,最好的方法就是產(chǎn)生一個(gè)一模一樣的類別出來
,而且不改變?cè)形锛膶傩约胺椒?,或者是在原有物件上擴(kuò)充功能。
?
?
?
以下提供一個(gè)另類的設(shè)計(jì)方法,來解決這個(gè)問題。假如有一個(gè)
TEdit
的物件
,我們希望它在修改資料的時(shí)候,可以改變顏色,在不改變?cè)形锛氖褂?/span>
介面下,如何來擴(kuò)充這個(gè)功能呢﹖
?
?
?
請(qǐng)看這個(gè)範(fàn)例的說明﹕
?
?
?
這個(gè)繼承自
TEdit
的
TMyEdit
很簡(jiǎn)單的宣告
ReadOnly
這個(gè)屬性,其他
Create
,
Load
的方法,只是要在設(shè)計(jì)期間取得目前正確的顏色設(shè)定而已。
?
?
?
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
如何改變?cè)瓉淼膶傩裕?qǐng)把焦點(diǎn)放在
SetReadOnly
上面,這個(gè)
procedrue
動(dòng)了以下的手腳
:
在繼承
ReadOnly
原有的屬性之後,進(jìn)行顏色的改變。
?
?
?
procedure TMyEdit.SetReadOnly(Value: boolean);
begin
? FReadOnly:= Value;
? inherited ReadOnly:= Value;
? SetColor;
end;
?
?
?
SetReadOnly
在父層類別
TCustomEdit
中已有定義,只是它被放在
private
區(qū)段裡,子類別是看不到的,否則只要改寫
SetReadOnly
方法就行了。在這裡重新定義了
ReadOnly
屬性,除了保有父類別
ReadOnly
屬性的作用,並賦予它新的行為。在設(shè)計(jì)類別時(shí),也許將
Get/Set
存取方法宣告在
protected
區(qū)段會(huì)比較方便,後代類別可以直接改寫
Get/Set
方法來改變或附加行為,但這也表示父類別將失去對(duì)私有成員的保護(hù)力,子類別幾乎
可以完全改變父類別的行為。因此,要把
Get/Set
放在
private
還是
protected
區(qū)段實(shí)為見仁見智的問題,設(shè)計(jì)者可視情況選擇對(duì)自己最有利的方式。
?
?
?
以下是
TMyEdit
所有實(shí)作的部分﹕
?
?
?
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;
?
?
寫好這個(gè)物件我們開始進(jìn)行測(cè)試,看這個(gè)物件如何無聲無息的嵌入我們已
經(jīng)寫好的單元,首先我們拉一個(gè)
Form1
出來,在上面放一個(gè)
Edit1
及
Button1
,當(dāng)然您還要建構(gòu)這個(gè)
TMyEdit
的物件,為了方便起見,請(qǐng)將這
個(gè)單元直接
Copy
到
Form1
所屬的單元裡頭,然後在
Button1
上面,寫入
:
?
?
?
TMyEdit(Edit1).ReadOnly := False;
?
?
執(zhí)行看看,按一下
Button1
,這時(shí)候
Edit1
的
ReadOnly
是不是多了改變顏色的功能﹖
?