可是對(duì)于初學(xué)者來(lái)說(shuō),面向?qū)ο蟮乃枷肟赡懿⒉皇荄elphi給其帶來(lái)的最大的感受。而可視化的界面設(shè)計(jì),豐富多樣的可用組件反而給其留下最深刻難忘的印象。由此帶來(lái)的嚴(yán)重的后果是,初學(xué)者往往在很長(zhǎng)一段時(shí)間里,只將注意力集中在Delphi提供的現(xiàn)有的VCL組件的使用上,而忽視去思考面向?qū)ο蟮乃枷雽?duì)于Delphi的整個(gè)組件構(gòu)架體系所蘊(yùn)含的意義。
下面的一段代碼,包含了一個(gè)最常見(jiàn)的,也是初學(xué)者最易犯的一個(gè)錯(cuò)誤,這個(gè)錯(cuò)誤雖然不是語(yǔ)法錯(cuò)誤,但是卻顯露出使用者的面向?qū)ο蟮乃枷脒€有待加強(qiáng):
var
Form1: TForm1;
implementation
{$R *.dfm}
PRocedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Form1.Caption); // <-- 這里的Form1的使用就有些問(wèn)題。
end;
這樣的代碼,粗看看好像沒(méi)有什么錯(cuò)。但是,這里Form1的出現(xiàn)就有些說(shuō)不過(guò)去了。明明這里的代碼,寫(xiě)的是TForm1的ButtonClick方法的實(shí)現(xiàn),而Form1作為T(mén)Form1類(lèi)的一個(gè)實(shí)例,居然被寫(xiě)死到類(lèi)的實(shí)現(xiàn)中,難道不是有些概念混亂嗎?要改成符合面向?qū)ο笏枷氲模埠芎?jiǎn)單,可以有兩種寫(xiě)法:
1. ShowMessage(Self.Caption); // <-- 這種寫(xiě)法非常明確,即將要Show的信息是類(lèi)的當(dāng)前實(shí)例的Caption
2. ShowMessage(Caption); // <-- 這里的寫(xiě)法和上述的雷同,省略了關(guān)鍵字Self;
面向?qū)ο笏枷氲娜蠛诵膬?nèi)容是封裝,繼承,多態(tài)。而上述例子暴露的問(wèn)題就是封裝的問(wèn)題。類(lèi)似的例子還有:
var
Form1: TForm1;
......
var
Form2: TForm2;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show; // <-- 作為一個(gè)全局的變量,F(xiàn)orm2在這里的使用同樣讓人覺(jué)得混亂。
end;
上述的例子,可能更具有普遍性吧,對(duì)于大多數(shù)情況,在一個(gè)工程中,TForm1,和TForm2只可能各只有一個(gè)實(shí)例,所以這樣的代碼也算馬馬虎虎通過(guò)。但是從嚴(yán)格意義上來(lái)說(shuō),也是不符合封裝性的要求。參照如下代碼:
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FNext: TForm;
public
{ Public declarations }
property NextForm: TForm read FNext write FNext;
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(FNext) then
TForm2(FNext).Show;
end;
end.
// 以下是工程文件中的內(nèi)容:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Form1.NextForm := Form2; // <-- 增加這么一句,勉強(qiáng)讓代碼符合封裝的要求了
Application.Run;
end.
將Form2指針,作為Form1的一個(gè)屬性,傳遞給Form1,這樣,F(xiàn)orm1在調(diào)用的時(shí)候,才遵守了封裝性的原則!當(dāng)然,這些代碼僅僅是為了體現(xiàn)封裝的思想,而在實(shí)際中,可以依個(gè)人的習(xí)慣來(lái)決定是否真的要實(shí)現(xiàn)的這么徹底。但是這種思想,應(yīng)當(dāng)在腦子里扎根......(未完,待續(xù))。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注