(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.在属性的写入方式中如果后面是一个方法,那么一般为过程,这个过程应该有一个参数,参数类型也要与属性类型相同。

原文地址:https://www.cnblogs.com/mdnx/p/2575199.html