类:初识类的属性
Code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyClass1 = class
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}
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass1: TMyClass1;
MyClass2: TMyClass2;
begin
MyClass1 := TMyClass1.Create;
MyClass2 := TMyClass2.Create;
MyClass1.FAge := 1000; //TMyClass1中的FAge字段可以接受一个离奇的年龄
MyClass2.Age := 199; //通过 TMyClass2中的age属性,只能赋一个合理的值
ShowMessage(IntToStr(MyClass2.Age));
MyClass1.Free;
MyClass2.Free;
end;
{ 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;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyClass1 = class
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}
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass1: TMyClass1;
MyClass2: TMyClass2;
begin
MyClass1 := TMyClass1.Create;
MyClass2 := TMyClass2.Create;
MyClass1.FAge := 1000; //TMyClass1中的FAge字段可以接受一个离奇的年龄
MyClass2.Age := 199; //通过 TMyClass2中的age属性,只能赋一个合理的值
ShowMessage(IntToStr(MyClass2.Age));
MyClass1.Free;
MyClass2.Free;
end;
{ 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;
end.