| 導購 | 订阅 | 在线投稿
分享
 
 
 

將面向對象的思想貫穿始終--談Delphi開發(第一篇)

來源:互聯網網民  2006-05-27 08:02:25  評論

國內有許多人將Delphi作爲首選的開發工具。其原因當然是因爲Delphi給開發者提供了諸多特性:面向對象的開發,可視化界面設計,組件豐富,多平台的可移植性。

可是對于初學者來說,面向對象的思想可能並不是Delphi給其帶來的最大的感受。而可視化的界面設計,豐富多樣的可用組件反而給其留下最深刻難忘的印象。由此帶來的嚴重的後果是,初學者往往在很長一段時間裏,只將注意力集中在Delphi提供的現有的VCL組件的使用上,而忽視去思考面向對象的思想對于Delphi的整個組件構架體系所蘊含的意義。

下面的一段代碼,包含了一個最常見的,也是初學者最易犯的一個錯誤,這個錯誤雖然不是語法錯誤,但是卻顯露出使用者的面向對象的思想還有待加強:

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(Form1.Caption); // <-- 這裏的Form1的使用就有些問題。

end;

這樣的代碼,粗看看好像沒有什麽錯。但是,這裏Form1的出現就有些說不過去了。明明這裏的代碼,寫的是TForm1的ButtonClick方法的實現,而Form1作爲TForm1類的一個實例,居然被寫死到類的實現中,難道不是有些概念混亂嗎?要改成符合面向對象思想的,也很簡單,可以有兩種寫法:

1. ShowMessage(Self.Caption); // <-- 這種寫法非常明確,即將要Show的信息是類的當前實例的Caption

2. ShowMessage(Caption); // <-- 這裏的寫法和上述的雷同,省略了關鍵字Self;

面向對象思想的三大核心內容是封裝,繼承,多態。而上述例子暴露的問題就是封裝的問題。類似的例子還有:

var

Form1: TForm1;

......

var

Form2: TForm2;

procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.Show; // <-- 作爲一個全局的變量,Form2在這裏的使用同樣讓人覺得混亂。

end;

上述的例子,可能更具有普遍性吧,對于大多數情況,在一個工程中,TForm1,和TForm2只可能各只有一個實例,所以這樣的代碼也算馬馬虎虎通過。但是從嚴格意義上來說,也是不符合封裝性的要求。參照如下代碼:

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.

// 以下是工程文件中的內容:

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; // <-- 增加這麽一句,勉強讓代碼符合封裝的要求了

Application.Run;

end.

將Form2指針,作爲Form1的一個屬性,傳遞給Form1,這樣,Form1在調用的時候,才遵守了封裝性的原則!當然,這些代碼僅僅是爲了體現封裝的思想,而在實際中,可以依個人的習慣來決定是否真的要實現的這麽徹底。但是這種思想,應當在腦子裏紮根......(未完,待續)。

更多文章

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
國內有許多人將Delphi作爲首選的開發工具。其原因當然是因爲Delphi給開發者提供了諸多特性:面向對象的開發,可視化界面設計,組件豐富,多平台的可移植性。 可是對于初學者來說,面向對象的思想可能並不是Delphi給其帶來的最大的感受。而可視化的界面設計,豐富多樣的可用組件反而給其留下最深刻難忘的印象。由此帶來的嚴重的後果是,初學者往往在很長一段時間裏,只將注意力集中在Delphi提供的現有的VCL組件的使用上,而忽視去思考面向對象的思想對于Delphi的整個組件構架體系所蘊含的意義。 下面的一段代碼,包含了一個最常見的,也是初學者最易犯的一個錯誤,這個錯誤雖然不是語法錯誤,但是卻顯露出使用者的面向對象的思想還有待加強: var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(Form1.Caption); // <-- 這裏的Form1的使用就有些問題。 end; 這樣的代碼,粗看看好像沒有什麽錯。但是,這裏Form1的出現就有些說不過去了。明明這裏的代碼,寫的是TForm1的ButtonClick方法的實現,而Form1作爲TForm1類的一個實例,居然被寫死到類的實現中,難道不是有些概念混亂嗎?要改成符合面向對象思想的,也很簡單,可以有兩種寫法: 1. ShowMessage(Self.Caption); // <-- 這種寫法非常明確,即將要Show的信息是類的當前實例的Caption 2. ShowMessage(Caption); // <-- 這裏的寫法和上述的雷同,省略了關鍵字Self; 面向對象思想的三大核心內容是封裝,繼承,多態。而上述例子暴露的問題就是封裝的問題。類似的例子還有: var Form1: TForm1; ...... var Form2: TForm2; procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; // <-- 作爲一個全局的變量,Form2在這裏的使用同樣讓人覺得混亂。 end; 上述的例子,可能更具有普遍性吧,對于大多數情況,在一個工程中,TForm1,和TForm2只可能各只有一個實例,所以這樣的代碼也算馬馬虎虎通過。但是從嚴格意義上來說,也是不符合封裝性的要求。參照如下代碼: 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. // 以下是工程文件中的內容: 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; // <-- 增加這麽一句,勉強讓代碼符合封裝的要求了 Application.Run; end. 將Form2指針,作爲Form1的一個屬性,傳遞給Form1,這樣,Form1在調用的時候,才遵守了封裝性的原則!當然,這些代碼僅僅是爲了體現封裝的思想,而在實際中,可以依個人的習慣來決定是否真的要實現的這麽徹底。但是這種思想,應當在腦子裏紮根......(未完,待續)。 [url=http://www.csdn.net/develop/my_article.asp?author=Musicwind]更多文章[/url]
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有