(6)类的属性 property (1)
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//父类
TMyForm = class
private
Name : String;
Age : Integer;
protected
procedure SetName(str : String);
function GetName : string;
procedure SetAge(AAge : Integer);
function GetAge : Integer;
//读写属性,用property声明这是一个属性,然后是属性名,类型,读取形式(可以是类成员,也可以是方法),写入形式(可以是类成员,也可以是方法)。
property FName : string read GetName write SetName; //读取写入都是方法
property FAge : Integer read GetAge write SetAge; //同上
end;
//子类
MyForm = class(TMyForm)
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyForm }
function TMyForm.GetAge: Integer;
begin
Result := Age;
end;
function TMyForm.GetName: string;
begin
Result := Name;
end;
procedure TMyForm.SetAge(AAge: Integer);
begin
Age := AAge;
end;
procedure TMyForm.SetName(str: String);
begin
Name := Str;
end;
//子类 ,子类已经继承了父类的所有方法与属性。
procedure TForm1.Button1Click(Sender: TObject);
var
MyForm1 : MyForm;
begin
MyForm1 := MyForm.Create;
MyForm1.FName := 'Tony';
MyForm1.FAge := 19;
ShowMessage('姓名:' + MyForm1.FName + #13 + '年龄:' + IntToStr(MyForm1.FAge));
MyForm1.Free;
end;
//父类
procedure TForm1.FormCreate(Sender: TObject);
var
My : TMyForm;
begin
My := TMyForm.Create;
My.FName := '123'; //设置姓名属性的参数为123
My.FAge := 18; //设置年龄属性的参数为18
ShowMessage('姓名:' + My.FName + #13 + '年龄:' + IntToStr(My.FAge));
My.Free;
end;
end.
使用属性需要主要的有以下几点 :
1. 读取与写入的方法的返回值类型或者数据成员的类型必须与属性名的类型一致。
2.如果子类与父类在不同的PAS文件中,子类想使用父类的属性,那么父类属性的数据成员必须是可见的(即至少要为protected,不能是private),如果是方法,方法不允许重载。
3.在属性的读取方式中如果后面是一个方法,那么一般为无参数方法,并且返回值与属性相同。
4.在属性的写入方式中如果后面是一个方法,那么一般为过程,这个过程应该有一个参数,参数类型也要与属性类型相同。