unit Unit1;
interface
//TMyClass1 類裡面只有兩個字段(變量來到類裡面稱做字段)
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end; TMyClass1 = class
//TMyClass2 類裡面包含兩個屬性(property)、兩個方法、兩個和 TMyClass1 相 同的字段
FName: string; {字段命名一般用 F 開頭, 應該是取 field 的首字母}
FAge: Integer; {另外: 類的字段必須在方法和屬性前面}
end;
{這個類中的兩個字段, 可以隨便讀寫; 在實際運用中, 這種情況是不存在的.} TMyClass2 = class
strict private
FName: string;
FAge: Integer;
procedure SetAge(const Value: Integer);
procedure SetName(const Value: string);
published
property Name: string read FName write SetName;
property Age: Integer read FAge write SetAge;
end;
{
但這裡的字段: FName、FAge 和方法: SetAge、SetName 是不能隨便訪問的,
因為, 它們在 strict private 區內, 被封裝了, 封裝後只能在類內部使用.
屬性裡面有三個要素:
1、指定數據類型: 譬如 Age 屬性是 Integer 類型;
2、如何讀取: 譬如讀取 Age 屬性時, 實際上讀取的是 FAge 字段;
3、如何寫入: 譬如希爾 Age 屬性時, 實際上是通過 SetAge 方法.
屬性不過是一個橋.
通過屬性存取字段 和 直接存取字段有什麼區別?
通過屬性可以給存取一定的限制,
譬如: 一個人的 age 不可能超過 200 歲, 也不會是負數; 一個人的名字也不應該是 空值.
看 implementation 區 TMyClass2 類的兩個方法的實現, 就增加了這種限制.
}
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyClass2 }
procedure TMyClass2.SetAge(const Value: Integer);
begin
if (Value>=0) and (Value<200) then
FAge := Value;
end;
procedure TMyClass2.SetName(const Value: string);
begin
if Value<>'' then
FName := Value;
end;
//測試:
procedure TForm1.Button1Click(Sender: TObject);
var
class1: TMyClass1;
class2: TMyClass2;
begin
class1 := TMyClass1.Create;
class2 := TMyClass2.Create;
class1.FAge := 1000; {TMyClass1 中的 FAge 字段可以接受一個離奇的年齡}
class2.Age := 99; {通過 TMyClass2 中的 Age 屬性, 只能賦一個合理的值}
//class2.FAge := 99; {TMyClass2 中的 FAge 字段被封裝了, 在這裡無法使用}
class1.Free;
class2.Free;
end;
end.