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

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

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

將面向對象的思想貫穿始終,這個題目好象有些大了。我剛才在這裏說的,提到的,其實只是在編碼的時候,應當注意的一些小問題。所以』貫穿始終』這個用語,改爲』牢記在心』可能更爲貼切。

對于Delphi某些特性的一點意見:

不知各位注意到沒有,在Delphi的Form中放置的所有組件(包括控件),對于其他Form來說,都是可見的,准確地說,這些組件都是該Form的Public部分的內容。這樣的結果,一方面是好的,因爲其靈活性,其他類可以方便的引用Form上的這些組件,設置它們的屬性,執行它們的方法,事件等等;但是另一方面它的缺陷也是顯而易見的,那就是導致了Form的封裝性的喪失。在我看來,放置于Form之上的這些組件,就使用者的本意而言,應當是作爲該Form的私有屬性而存在的,對于其他類或其他Form本應該不可見。即使需要訪問它們,也應當通過由Form提供一系列的屬性方法來間接的訪問。

舉個例子,讓大家有些感性的認識:

procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.Edit1.Text := 'abc'; // <-- 這個句子的寫法,本人很不贊同。

end;

可能很多人寫這樣的代碼的時候腦子裏還沒有封裝性的概念,可是你看了這篇文章,就再也不要幹這樣的事了(改邪歸正吧你!)。在我看來TForm1就是TForm1,TForm2就是TForm2,它們都是爲了實現某些特定的功能而存在的,所以它們提供給外界一些接口(一些屬性,方法,還有事件,事件說嚴格一點,也是屬性),來實現它們自己所承諾的功能。至于這些接口的具體實現,應當由它們自身來維護,外界沒有必要,也沒有辦法插手。這個思想,對應到實際應用中,也就是Form2.Edit1是否有必要被From1直接訪問的問題了。我本人比較傾向于下面的實現:

//以下爲Unit1中TForm1的部分內容

procedure TForm1.Button1Click(Sender: TObject);

begin

TForm2(FAnotherForm).EditText := 'abc'; // <-- 這個實現,體現了封裝的思想

end;

//以下爲Unit2中TForm2的定義

type

TForm2 = class(TForm)

Edit1: TEdit;

private

function GetEditText: string;

procedure SetEditText(const Value: string);

public

property EditText: string read GetEditText write SetEditText;

// <-- 我的推薦用法;

end;

……

function TForm2.GetEditText: string;

begin

result := Edit1.Text;

end;

procedure TForm2.SetEditText(const Value: string);

begin

if Value <> EditText then

Edit1.Text := Value;

end;

這裏的FAnotherForm是TForm1的一個私有屬性,它是指向TForm2的一個實例的指針(這個用法在第一篇裏做了強調)。訪問TForm2的EditText 屬性,而不是魯莽的直接訪問TForm2的Edit1.Text,體現了一種思想,那就是分工協作的思想,那就是獨立自主的思想,也就是封裝性的思想。

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
將面向對象的思想貫穿始終,這個題目好象有些大了。我剛才在這裏說的,提到的,其實只是在編碼的時候,應當注意的一些小問題。所以』貫穿始終』這個用語,改爲』牢記在心』可能更爲貼切。 對于Delphi某些特性的一點意見: 不知各位注意到沒有,在Delphi的Form中放置的所有組件(包括控件),對于其他Form來說,都是可見的,准確地說,這些組件都是該Form的Public部分的內容。這樣的結果,一方面是好的,因爲其靈活性,其他類可以方便的引用Form上的這些組件,設置它們的屬性,執行它們的方法,事件等等;但是另一方面它的缺陷也是顯而易見的,那就是導致了Form的封裝性的喪失。在我看來,放置于Form之上的這些組件,就使用者的本意而言,應當是作爲該Form的私有屬性而存在的,對于其他類或其他Form本應該不可見。即使需要訪問它們,也應當通過由Form提供一系列的屬性方法來間接的訪問。 舉個例子,讓大家有些感性的認識: procedure TForm1.Button1Click(Sender: TObject); begin Form2.Edit1.Text := 'abc'; // <-- 這個句子的寫法,本人很不贊同。 end; 可能很多人寫這樣的代碼的時候腦子裏還沒有封裝性的概念,可是你看了這篇文章,就再也不要幹這樣的事了(改邪歸正吧你!)。在我看來TForm1就是TForm1,TForm2就是TForm2,它們都是爲了實現某些特定的功能而存在的,所以它們提供給外界一些接口(一些屬性,方法,還有事件,事件說嚴格一點,也是屬性),來實現它們自己所承諾的功能。至于這些接口的具體實現,應當由它們自身來維護,外界沒有必要,也沒有辦法插手。這個思想,對應到實際應用中,也就是Form2.Edit1是否有必要被From1直接訪問的問題了。我本人比較傾向于下面的實現: //以下爲Unit1中TForm1的部分內容 procedure TForm1.Button1Click(Sender: TObject); begin TForm2(FAnotherForm).EditText := 'abc'; // <-- 這個實現,體現了封裝的思想 end; //以下爲Unit2中TForm2的定義 type TForm2 = class(TForm) Edit1: TEdit; private function GetEditText: string; procedure SetEditText(const Value: string); public property EditText: string read GetEditText write SetEditText; // <-- 我的推薦用法; end; …… function TForm2.GetEditText: string; begin result := Edit1.Text; end; procedure TForm2.SetEditText(const Value: string); begin if Value <> EditText then Edit1.Text := Value; end; 這裏的FAnotherForm是TForm1的一個私有屬性,它是指向TForm2的一個實例的指針(這個用法在第一篇裏做了強調)。訪問TForm2的EditText 屬性,而不是魯莽的直接訪問TForm2的Edit1.Text,體現了一種思想,那就是分工協作的思想,那就是獨立自主的思想,也就是封裝性的思想。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有