理解 Delphi 的类(三) - 初识类的属性

属性的概念

属性是用来描述一类事务得特征的,这种特征能够运行对象的可视化行为或者对他的操作。

类的属性大致分为两种:

        1)普通的数据成员属性(类属性)

type
    TForm1 = Class(TForm)
    private
        VclName : string;    //这里就是普通的数据成员

        2)可进行读写操作的属性(对象编辑器中显示的属性)

对属性值的修改会调用相应的属性设置方法。这类属性以property关键字为标识。


属性的访问

属性的访问是指再属性声明时设置对属性读和写操作的方法。这里是用read来标识属性的读方法,用write来标识属性的写方法。语法形式如下:

read 数据成员名/方法名
write    数据成员名/方法名
{
    read后面一般会跟一个和属性类型相同的变量用来读取属性的值
    write后面一般会跟一个固定格式的过程用来设置属性的值
}

 “数据成员名/方法名”,如果是成员名,那么这个数据成员必须与属性的类型相同

这两个必须是已经声明了的,可以是当前类的(这两个名必须可见),也可以是父类的(至少是protected,不能是private)


 示例 

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 Button1Click(Sender: TObject);
  end;


  //TMyClass 类里面包含两个属性(property)、两个方法、两个和 TMyClass1 相同的字段
  TMyClass = class
  strict private
    FName: string;    //类的字段必须放在属性和方法前面
    FAge:  Integer;   //字段以F开头,field
    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 区 TMyClass 类的两个方法的实现, 就增加了这种限制.
   }

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TMyClass.SetAge(const Value: Integer);
begin
  if (Value>=0) and (Value<200) then
    FAge := Value;
end;

procedure TMyClass.SetName(const Value: string);
begin
  if Value<>'' then
    FName := Value;
end;


//测试:
procedure TForm1.Button1Click(Sender: TObject);
var
  myclass: TMyClass;
begin
  myclass := TMyClass.Create;

  myclass.Age  := 99;   {通过 TMyClass 中的 Age 属性, 只能赋一个合理的值}
  //class.FAge := 99; {TMyClass 中的 FAge 字段被封装了, 在这里无法使用}

  myclass.Free;    //对象的释放。
end;
end.

strict private是 Delphi 7 之后新增的语法, 它解决了在同一单元私有成员不不保密的问题.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸福西西弗斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值