關於屬性的話題還有很多, 譬如: 數組屬性、默認屬性、class 屬性等等.
先總結一下前面提到過的屬性吧.TMyClass = class(TObject)
1、屬性用 property 定義;
private
FName: string;
procedure SetName(const Value: string);
published
property Name: string read FName write SetName;
end;
2、read、write 兩個關鍵字至少要存在一個, 如果只有一個就成了只讀屬性或只寫屬性;
3、屬性名後面也要指定類型(必須是內置類型或定義在前面的類型), 存取的類型必須要和它一致;
4、屬性用到的字段與方法一定要聲明在屬性前面;
5、如果屬性讀(read)的是方法, 那麼這個方法一定是個函數, 且返回值與屬性類型一致;
如果屬性是非數組屬性, 該函數是無參數的, 譬如: function GetName: string;
6、如果屬性寫(write)的是方法(一般也不會是字段), 那麼這個方法一定是個過程;
如果屬性是非數組屬性, 該過程必須只有一個參數, 參數類型必須和屬性一致; 並且參數必須是傳值的;
譬如: procedure SetName(s: string); 或者 procedure SetName(const s: string);
7、屬性調用的方法不能是虛方法或動態方法; 不能是重載方法;
8、如果屬性在 published 區, 那它調用的方法只能使用默認的 register 調用約定;
9、屬性一般放在 published 區, 如果屬性不是公開的也就失去了屬性的意義;
10、如果自定義的類不需要 RTTI 或許把屬性放到 public 區會更節省(個人認為);
11、屬性讀寫的變量或方法一般放在 private 區, 如果都公開了就用不著屬性了;
12、事件屬性讀寫的必須是方法, 不能是變量;
13、屬性只是一個橋, 它沒有指針(它讀寫的變量和方法才有指針), 目的是方便存取並提出存取限制;
14、還有 Delphi 的 IDE 為書寫屬性提供了非常方便的快捷鍵, 譬如:
輸入: property Name: string; 然後執行 Ctrl+Shift+C ... 哇!
---屬性是個奇妙的創意, 讀寫屬性就像讀寫結構一樣方便; 但屬性的規矩好多啊, 但這還只是一般屬性的法則.