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

简介: 理解 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 之后新增的语法, 它解决了在同一单元私有成员不不保密的问题.

相关文章
|
5月前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念,它允许我们基于现有的类(或构造函数)创建新的类
【6月更文挑战第15天】JavaScript继承促进代码复用与扩展,创建类层次结构,但过深的继承链导致复杂性增加,紧密耦合增加维护成本,单继承限制灵活性,方法覆盖可能隐藏父类功能,且可能影响性能。设计时需谨慎权衡并考虑使用组合等替代方案。
46 7
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
30 1
|
6月前
|
存储 容器
Qt中 QMap 类、QHash 类、QVector 类详解
Qt中 QMap 类、QHash 类、QVector 类详解
Qt中 QMap 类、QHash 类、QVector 类详解
|
6月前
|
安全 编译器 程序员
类与对象(二)--类的六个默认成员函数超详细讲解
类与对象(二)--类的六个默认成员函数超详细讲解
类与对象(二)--类的六个默认成员函数超详细讲解
|
6月前
|
C++ 存储 容器
Qt QList类和QLinkedList类 详解
Qt QList类和QLinkedList类 详解
|
Python
Python编程:旧式类和新式类的区别
Python编程:旧式类和新式类的区别
81 0
Python编程:旧式类和新式类的区别
|
Java
Java面向对象(1)--对象的创建使用类的实例化
Java面向对象(1)--对象的创建使用类的实例化
85 1
理解 Delphi 的类(二) - 初识类的方法
理解 Delphi 的类(二) - 初识类的方法
|
存储 Java 编译器
【C++初阶:类和对象(上篇)】类的定义 | 类的访问限定符及封装 | 类的作用域 | 类的实例化 | 类对象模型 | this指针
【C++初阶:类和对象(上篇)】类的定义 | 类的访问限定符及封装 | 类的作用域 | 类的实例化 | 类对象模型 | this指针
156 0
【C++初阶:类和对象(上篇)】类的定义 | 类的访问限定符及封装 | 类的作用域 | 类的实例化 | 类对象模型 | this指针