理解Delphi的类(三)

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.

时间: 2024-11-05 18:46:14

理解Delphi的类(三)的相关文章

理解Delphi的类(七)

什么是多态? 我的理解就是: 同样一个方法, 在不同的对象里会有不同的实现, 仅此 而已. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; pr

理解Delphi的类(十二)

关于属性的话题还有很多, 譬如: 数组属性.默认属性.class 属性等等. 先总结一下前面提到过的属性吧. TMyClass = class(TObject) private FName: string; procedure SetName(const Value: string); published property Name: string read FName write SetName; end; 1.属性用 property 定义; 2.read.write 两个关键字至少要存在一

理解Delphi的类(十一)

[1] - 虚方法与动态方法 方法来到类中, 以前的特点基本都在; 因为类一般是存在于一个继承链中, 所以就有了一些新的概念, 譬如: 继承.覆盖;也 有了很多新名称, 譬如: 静态方法.虚方法.动态方法.抽象方法.类方法.消息方法. 先从虚方法与动态方法开始吧 //下面的类中就定义了两个虚方法(virtual).两个动态方法(dynamic) TMyClass = class procedure Proc1(x,y: Real); virtual; function Fun1(x,y: Rea

理解Delphi的类(十)

类中包含字段.方法和属性(属性包含事件); 字段是靠方法组织与操作的; 属性也只 是方便和规范了字段与方法的使用. 因此我觉得: 方法是最重要的. 方法无处不在, 它不仅仅存在与类中. 先从非类中的方法谈起吧, 因为类中的方法也 拥有全部这些特性. 离开类的怀抱, 我们更喜欢把方法叫做过程或函数. //要点1: 过程用 procedure 定义, 函数用 function 定义; 过程没有返回值, 函数 需要返回值. procedure MyProc; begin ShowMessage('ok

理解Delphi的类(八)

//标准语法 TMyClass1 = class(TObject) end; //如果是继承自 TObject 可以省略 TMyClass2 = class end; //可以实现多个接口; 实现接口时经常用到 TInterfacedObject 类, 它实现了接口的默 认方法 TMyClass3 = class(TInterfacedObject, Interface1, Interface2) end; //现在 TMyClass4 相当于 TObject 的别名 TMyClass4 = c

理解Delphi的类(六)

//这个类中的两个字段没有封装 TMyClass1 = class FName: string; FAge: Integer; end; //这个类中的两个字段封装了, 外部不能读写 TMyClass2 = class private FName: string; FAge: Integer; //public end; //那怎么读写? 用属性啊 TMyClass3 = class private FName: String; FAge: Integer; procedure SetAge(c

理解Delphi的类(五)

先新建一个 VCL Forms Application 工程, 代码中就已经出现了两个类: 一个是 TForm 类; 一个是 TForm1 类; TForm1 继承于 TForm. TForm 是 TForm1 的父类; TForm1 是 TForm 的子类. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls

理解Delphi的类(四)

先勾画一下思路: 1.建立一个类, 里面有年龄字段 FAge; 2.通过 Age 属性读写 FAge; 3.如果输入的年龄刚好是 100 岁, 将会激发一个事件, 这个事件我们给它命名为: OnHundred unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TFor

理解Delphi的类(二)

说到"类", 就会提到: 属性.方法.事件 (这是类包含的内容); 封装.继承.多态 (这是类的主要用途). 下面定义并调用了了一个过程 MyProc.一个函数 MyFun. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: