請問C# 的get/set ,在DELPHI2005 怎麼表示呢? |
答題得分者是:Gordon Li
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
wodahs
初階會員 發表:0 回覆:33 積分:26 註冊:2004-02-26 發送簡訊給我 |
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
wodahs
初階會員 發表:0 回覆:33 積分:26 註冊:2004-02-26 發送簡訊給我 |
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
wodahs
初階會員 發表:0 回覆:33 積分:26 註冊:2004-02-26 發送簡訊給我 |
補充上面的回答:
基本上你發生的錯誤應該哪裡寫錯,我上一封寫的是凡屬性宣告,經編譯都會產生一組對應的方法set_XXX, get_XXX的方法,如C#的宣告方式:
private string _address;
public String Address {
get {
return _address;
}
set {
_address = value;
}
}
編譯後會自動產生get_Address, set_Address兩個方法. 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接
她宣告是
private
_address: String;
public
function get_Address: String;
procedure set_Address(const Value: String);
property Adddress: String read get_Address write set_Address; 不夠兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像
procedure TClass1.set_Adddress(Value: String); //這個是自動產生的,不是我們寫
begin
Self.set_Address(Value); //這是呼叫我們宣告的
end; 我待會寫個完整範例給你看. unit InfoLight; interface type
TClass1 = class
private
_address: String;
public
function get_Address: String;
procedure set_Address(const Value: String);
{ Private Declarations }
public
constructor Create;
property Adddress: String read get_Address write set_Address;
end; implementation constructor TClass1.Create;
begin
inherited Create;
// TODO: Add any constructor code here
end; function TClass1.get_Address: String;
begin
Result := _address;
end; procedure TClass1.set_Address(const Value: String);
begin
_address := Value;
end; end. 發表人 - wodahs 於 2005/02/18 22:43:24 發表人 - wodahs 於 2005/02/18 23:56:34
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
引言: 補充上面的回答: 基本上你發生的錯誤應該哪裡寫錯,我上一封寫的是凡屬性宣告,經編譯都會產生一組對應的方法set_XXX, get_XXX的方法,如C#的宣告方式: private string _address; public String Address { get { return _address; } set { _address = value; } } 編譯後會自動產生get_Address, set_Address兩個方法. 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接 她宣告是 private _address: String; public function get_Address: String; procedure set_Address(const Value: String); property Adddress: String read get_Address write set_Address; 不夠兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像 procedure TClass1.set_Adddress(Value: String); //這個是自動產生的,不是我們寫 begin Self.set_Address(Value); //這是呼叫我們宣告的 end; 我待會寫個完整範例給你看. unit InfoLight; interface type TClass1 = class private _address: String; public function get_Address: String; procedure set_Address(const Value: String); { Private Declarations } public constructor Create; property Adddress: String read get_Address write set_Address; end; implementation constructor TClass1.Create; begin inherited Create; // TODO: Add any constructor code here end; function TClass1.get_Address: String; begin Result := _address; end; procedure TClass1.set_Address(const Value: String); begin _address := Value; end; end. 發表人 - wodahs 於 2005/02/18 22:43:24 發表人 - wodahs 於 2005/02/18 23:56:34看來,DELPHI 還是與先前一樣必需做許多程式碼才行,比起C# 來,煩擾許多。 請問,這是您指的完整範例嗎? DHM
------
ATEIN |
wodahs
初階會員 發表:0 回覆:33 積分:26 註冊:2004-02-26 發送簡訊給我 |
1.對,因為不好意思在開個新Post,所以直接編輯在舊的Post. :) 2.Code的確比較多,不過這是與語言規劃編寫架構相關,Delphi.Net考量傳承之前的開發方式,是Borland於發展Delphi.Net的負荷,但也是對於追隨者的承諾.每種語言編譯改寫成符合CLS的架構的語言,除特別需要(CLS型別轉換支援,限制(pointer, unsafe code),應該會儘量符合原語言的特性,所以,比較程式碼多寡可能比較沒有意義,C語言本來較比較精簡,但過於彈性有時可讀性便變差,如果Delhi.Net改成非常精簡(以Dany的功力輕而易舉),不過這樣一來,向前不相容,使用者還需大量重新學習,與當初CLS訂定的原意有點相悖.其實為了相容,讓開發者盡量沿用原有開發習慣,Delphi.Net研發團隊花了時間定相容架構,寫了一些Helper Class不見得會比重新制定一個新的簡單. 3.範例中其實大部分Code是自動產生,就開發而言,Delphi.Net IDE已盡量簡化Code的動作.真正寫的部份與C# IDE寫的差不多.
像上面的程式碼,寫作方法:(我回去修改上一封註解,請對照看,不另貼,節省網路資源)
a.定義Property那行,按ctrl-shit-c產生屬性存取方法的宣告及實作段的框架
b.實作存取方法內容.
不是與C# IDE寫法差不多.所以盡量不要以程式碼多寡決定程式優劣,各撰寫方式各有優缺. 發表人 - wodahs 於 2005/02/20 13:21:52 發表人 - wodahs 於 2005/02/20 13:24:58
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
wodahs
初階會員 發表:0 回覆:33 積分:26 註冊:2004-02-26 發送簡訊給我 |
|
Gordon Li
一般會員 發表:1 回覆:25 積分:20 註冊:2004-11-15 發送簡訊給我 |
>看來,DELPHI 還是與先前一樣必需做許多程式碼才行,比起C# 來,煩擾許 >多。請問,這是您指的完整範例嗎? 不需要, 上面的討論不完全正確, 你的C#程式可用下面的Delphi來表示: type
TClass1 = class
private
FAddress: String;
{ Private Declarations }
public
constructor Create;
property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address, 程式師不需要自己宣告和實作.因此上面你們討論的程式: TClass1 = class
private
_address: String;
public
function get_Address: String;
procedure set_Address(const Value: String);
{ Private Declarations }
public
constructor Create;
property Adddress: String read get_Address write set_Address; //a.宣告屬性 ,按Ctrl-Shit-C產生g;宣告及實作方法框架
end; implementation constructor TClass1.Create;
begin
inherited Create;
// TODO: Add any constructor code here
end; function TClass1.get_Address: String;
begin
Result := _address; //b.實作屬性Get方法 (即C# get {}段內容)
end; procedure TClass1.set_Address(const Value: String);
begin
_address := Value; //b.實作屬性Set方法 (即C# set {}段內容)
end; 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
引言: >看來,DELPHI 還是與先前一樣必需做許多程式碼才行,比起C# 來,煩擾許 >多。請問,這是您指的完整範例嗎? 不需要, 上面的討論不完全正確, 你的C#程式可用下面的Delphi來表示: type TClass1 = class private FAddress: String; { Private Declarations } public constructor Create; property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address, 程式師不需要自己宣告和實作.因此上面你們討論的程式: TClass1 = class private _address: String; public function get_Address: String; procedure set_Address(const Value: String); { Private Declarations } public constructor Create; property Adddress: String read get_Address write set_Address; //a.宣告屬性 ,按Ctrl-Shit-C產生g;宣告及實作方法框架 end; implementation constructor TClass1.Create; begin inherited Create; // TODO: Add any constructor code here end; function TClass1.get_Address: String; begin Result := _address; //b.實作屬性Get方法 (即C# get {}段內容) end; procedure TClass1.set_Address(const Value: String); begin _address := Value; //b.實作屬性Set方法 (即C# set {}段內容) end; 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.type TClass1 = class private FAddress: String; { Private Declarations } public constructor Create; property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address?(這樣表示時,依照您提到,按Ctrl-Shit-C不會產生屬性set/get框架?!)還是有哪裡錯了? 李維 大師,謝謝您 ! DHM
------
ATEIN |
wodahs
初階會員 發表:0 回覆:33 積分:26 註冊:2004-02-26 發送簡訊給我 |
引言: 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.嗯,可能之前我想太多而錯誤考慮詢問者可能有其他的考量,一定要擁有與C#宣告方式等值架構,例設定傳回值需經計算,有事件觸發,設定值檢查等需求等.所以才依C#的架構所寫等值程式,因此使用比較冗長的方式,實際上運作情形,同之前寫文章所述的(以Set Function為例): 引言: 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接 她宣告是 private _address: String; public function get_Address: String; procedure set_Address(const Value: String); property Address: String read get_Address write set_Address; 不過兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像 procedure TClass1.set_Address(Value: String); //這個是自動產生的,不是我們寫 begin Self.set_Address(Value); //這是呼叫我們宣告的 end;不過,有一點抱歉的是,我本來雞婆是想跟詢問者說明流程,在例子內把Address多打了一個d區別,結果我自己忘記了 ^^",這樣的缺點是除了Get/Set Function會自動產生外,我們程式還是會另外產生方法,然後於自動產生的程式內很笨的呼叫我們自訂的函式. 所以,如果是沒有額外的需求,可能就如李大師所說方式比較簡單. 其實,如果把名稱改成保留的格式後,set_XXX, get_XXX; Delphi.Net Compiler會以我們程式裡自訂fuction來取代預設的set/get function,這樣就不會產生額外的member function,因為compiler會很聰明,直接替換預設.不會這麼笨會照之前說的流程,編譯產生多餘的程式碼 ^^" 沒說清楚,造成誤解,特此致歉! 謝謝李維大師指教! ^^ wodahs ====================================================================== 我是非出身科班的菜鳥,瞎子摸象,寫錯的地方,請大家包涵包涵,不要太認真 ^^ 歡迎大家批評指教,適時糾正我錯誤觀念,這樣我才會進步並學到正確的知識 ^^ ====================================================================== |
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
引言:加入 set_/get_ 後可以自動產生了,謝謝各位的指教及協助解答。 在此謝謝 李維 大師及wodahs. DHM引言: 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.嗯,可能之前我想太多而錯誤考慮詢問者可能有其他的考量,一定要擁有與C#宣告方式等值架構,例設定傳回值需經計算,有事件觸發,設定值檢查等需求等.所以才依C#的架構所寫等值程式,因此使用比較冗長的方式,實際上運作情形,同之前寫文章所述的(以Set Function為例):引言: 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接 她宣告是 private _address: String; public function get_Address: String; procedure set_Address(const Value: String); property Address: String read get_Address write set_Address; 不過兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像 procedure TClass1.set_Address(Value: String); //這個是自動產生的,不是我們寫 begin Self.set_Address(Value); //這是呼叫我們宣告的 end;不過,有一點抱歉的是,我本來雞婆是想跟詢問者說明流程,在例子內把Address多打了一個d區別,結果我自己忘記了 ^^",這樣的缺點是除了Get/Set Function會自動產生外,我們程式還是會另外產生方法,然後於自動產生的程式內很笨的呼叫我們自訂的函式. 所以,如果是沒有額外的需求,可能就如李大師所說方式比較簡單. 其實,如果把名稱改成保留的格式後,set_XXX, get_XXX; Delphi.Net Compiler會以我們程式裡自訂fuction來取代預設的set/get function,這樣就不會產生額外的member function,因為compiler會很聰明,直接替換預設.不會這麼笨會照之前說的流程,編譯產生多餘的程式碼 ^^" 沒說清楚,造成誤解,特此致歉! 謝謝李維大師指教! ^^ wodahs ====================================================================== 我是非出身科班的菜鳥,瞎子摸象,寫錯的地方,請大家包涵包涵,不要太認真 ^^ 歡迎大家批評指教,適時糾正我錯誤觀念,這樣我才會進步並學到正確的知識 ^^ ======================================================================
------
ATEIN |
wodahs
初階會員 發表:0 回覆:33 積分:26 註冊:2004-02-26 發送簡訊給我 |
引言: type TClass1 = class private FAddress: String; { Private Declarations } public constructor Create; property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address?(這樣表示時,依照您提到,按Ctrl-Shit-C不會產生屬性set/get框架?!)還是有哪裡錯了? 李維 大師,謝謝您 ! DHMHi, DHM, 1.不好意思,給你的範例Address 多個d. 2.如果是沒有自訂getter/setter function需求,就不用定義set/get function了,這樣編譯時會自己產生取得定義變數的方法. 3.如果有定義自訂的function,可以參考我上一封的回覆.這是我自己亂試在用的,因為我寫的時候有檢查設定值,未出始值處理及事件觸發的壞習慣.所以比較冗長.不過應該有更簡單的方法.如果有時間的話,我再看看文件,可能有比較正統的簡單方法,再跟您報告. ^^ wodahs ====================================================================== 我是非出身科班的菜鳥,瞎子摸象,寫錯的地方,請大家包涵包涵,不要太認真 ^^ 歡迎大家批評指教,適時糾正我錯誤觀念,這樣我才會進步並學到正確的知識 ^^ ====================================================================== 發表人 - wodahs 於 2005/02/21 15:44:07 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |