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

相关文章
|
JSON 监控 Java
【SpringMVC】JSON数据返回及异常处理
Jackson是一个用于Java对象和JSON数据之间相互转换的开源库。它提供了一组强大的API,可以将Java对象序列化为JSON格式的字符串,也可以将JSON字符串反序列化为Java对象。Jackson库由三个核心模块组成::用于将Java对象与JSON数据进行绑定(序列化和反序列化)。它提供了一系列注解,如等,用于指定对象属性与JSON字段之间的映射关系,以及日期、时间等特殊类型的处理方式。Databind模块也提供了一些高级特性,如多态类型处理、双向引用处理等。
|
8月前
|
存储 JSON Java
深入理解 JWT 中 Claims 的设计及其合理性
JWT(JSON Web Token)中 Claims 是存储用户或业务信息的关键部分。JJWT 库通过 `setClaims` 方法支持传入 `Map&lt;String, Object&gt;` 或 `Claims` 对象,确保灵活性与高效性。本文从源码角度剖析 JWT Claims 的设计思想,介绍三种实现方式:使用 `HashMap`、`DefaultClaims` 和逐个添加声明,并分析其合理性。这种基于 Map 的设计符合 JSON 格式特性,易于扩展且性能优越,为开发者提供灵活的选择,满足不同业务需求。
466 2
|
人工智能 编解码 前端开发
深入了解 Three.js 中的材质与光照
Three.js 是一个强大的 JavaScript 库,用于在浏览器中创建和渲染 3D 场景。它的易用性和灵活性使得开发者能够轻松构建丰富的视觉体验。在 Three.js 中,材质与光照是影响物体外观和场景氛围的关键因素。本文将深入探讨 Three.js 中的材质类型、光源类型、光照模型,以及如何将它们结合以实现逼真的效果。
337 4
【.NET Core】反射(Reflection)详解(三)
【.NET Core】反射(Reflection)详解(三)
262 1
|
缓存 文件存储 Windows
何恢复被卸载软件的数据记录
何恢复被卸载软件的数据记录
1021 5
|
SQL 存储 关系型数据库
如何查看数据库中的表及其在SQL中的实现
引言:在数据库管理和数据分析的过程中,我们经常需要查看数据库中的表以获取相关信息。表是数据库中存储数据的主要结构,通过查看这些表,我们可以了解数据库的结构和内容。本文将详细介绍如何使用SQL查询来查看数据库中的表,包括各种相关操作和命令的使用。一、了解数据库和表的基本概念在讨论如何查看数据库中的表之
623 2
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
713 6
|
存储 关系型数据库 MySQL
mysql optimizer_switch : 查询优化器优化策略深入解析
mysql optimizer_switch : 查询优化器优化策略深入解析
Delphi调用BarTender打印条码标签简明开发教程
Delphi调用BarTender打印条码标签简明开发教程
339 1
ElasticSearch聚合查询Restful语法和JavaApi详解(基于ES7.6)
在前面关于ES的一系列文章中,已经介绍了ES的概念、常用操作、JavaAPI以及实际的一个小demo,但是在真实的应用场景中,还有可能会有更高阶的一些用法,今天主要介绍两种相对来说会更难一些的操作,聚合查询。该文档基于ElasticSearch7.6,将介绍restful查询语法以及JavaApi。 阅读本文需要你有ElasticSearch的基础。
1043 0