文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 521
阅读 2
收藏 0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

  //TMyClass1 类里面只有两个字段(变量来到类里面称做字段)
  TMyClass1 = class
    FName: string;  {字段命名一般用 F 开头, 应该是取 field 的首字母}
    FAge:  Integer; {另外: 类的字段必须在方法和属性前面}
  end;
  {这个类中的两个字段, 可以随便读写; 在实际运用中, 这种情况是不存在的.}


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

var
  Form1: TForm1;

implementation

{$R *.dfm}


{ TMyClass2 }

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

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


//测试:
procedure TForm1.Button1Click(Sender: TObject);
var
  class1: TMyClass1;
  class2: TMyClass2;
begin
  class1 := TMyClass1.Create;
  class2 := TMyClass2.Create;

  class1.FAge := 1000; {TMyClass1 中的 FAge 字段可以接受一个离奇的年龄}
  class2.Age  := 99;   {通过 TMyClass2 中的 Age 属性, 只能赋一个合理的值}
  //class2.FAge := 99; {TMyClass2 中的 FAge 字段被封装了, 在这里无法使用}

  class1.Free;
  class2.Free;
end;

end.

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/01/11/1034523.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
初识Jackson

首先我们学习json的时候第一想到的是如何将JavaBean对象转化成Json字符串,或者怎样将json字符串转化成JavaBean对象。 一.JavaBean对象转化成Json字符串(串行化) 使用ObjectMapper object...

帅得拖网速
2016/08/11
60
0
iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程

iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程 一、引言 众所周知,绚丽动画效果是iOS系统的一大特点,通过UIView层封装的动画,基本已经可以满足我们应用开发的所有需求,...

珲少
2015/11/25
1K
0
java扫盲 接口 Enumeration

java扫盲 接口 Enumeration 摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 记起2年前,高中生活最多的是老师的批评。谢谢! -泥沙砖瓦...

泥沙砖瓦浆木匠
2014/08/12
0
0
从零开始学ASP.NET(基础篇)

原作者:蓝鲸 出处:5D多媒体 学ASPNET与ASP有区别,这种区别不是语言上的,而是思路上的区别。ASP是纯面向过程的,而ASPNET是完全面向对向的。这种区别使我们在编程的结构设计上要与ASP有很...

晨曦之光
2012/03/09
592
0
java的IO流很重要,初识OutputStream

OutputStream类型 该类别的类决定了输出所要去往的目标: 1. 字节数组(不是字符串) 2. 文件 3. 管道 FilterOutputStream也属于一种OutputStream,为“装饰器”类提供基类,其中,“装饰器”...

整理秀逗的脑袋
2011/09/19
693
2

没有更多内容

加载失败,请刷新页面

加载更多

分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
25分钟前
2
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
33分钟前
1
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
43分钟前
16
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
1
0
区块链技术中的那些能商用的企业级应用

WEPOWER是一家立陶宛初创企业,旨在改变可再生电力项目的付费方式。WePower公司创始人Nick Martyniuk表示,政府统一收购价的存在推动了全球风能与太阳能市场的发展。因此,他的公司希望帮助那...

问题终结者
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部