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

相关文章
|
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个默认成员函数)
26 1
|
6月前
|
存储 容器
Qt中 QMap 类、QHash 类、QVector 类详解
Qt中 QMap 类、QHash 类、QVector 类详解
Qt中 QMap 类、QHash 类、QVector 类详解
|
6月前
|
安全 编译器 程序员
类与对象(二)--类的六个默认成员函数超详细讲解
类与对象(二)--类的六个默认成员函数超详细讲解
类与对象(二)--类的六个默认成员函数超详细讲解
|
5月前
|
Java 编译器 数据处理
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
57 0
|
Java
Java面向对象(1)--对象的创建使用类的实例化
Java面向对象(1)--对象的创建使用类的实例化
84 1
|
Java
Java面向对象(2)--类的成员属性
Java面向对象(2)--类的成员属性
83 0
Java面向对象(2)--类的成员属性
理解 Delphi 的类(二) - 初识类的方法
理解 Delphi 的类(二) - 初识类的方法
MFC CFileFind类用法总结
MFC CFileFind类用法总结
419 0
|
存储 对象存储 iOS开发
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(二)
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(二)
426 0