zoukankan      html  css  js  c++  java
  • 理解 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.
    
  • 相关阅读:
    KVM---利用 libvirt+qemu-kvm 创建虚拟机
    docker---安装docker
    Ubuntu---VIM 常用命令
    Ubuntu--- 安装VMware 报错 Build enviroment error!
    Ubuntu---不能打开 exfat 文件系统格式的 U盘解决方法
    Ubuntu---gedit 打开windows 下 .txt 文件乱码的解决方法
    MCS-51单片机的串行口及串行通信技术
    MCS-51单片机的定时器/计数器
    MCS-51单片机的中断系统
    计算机网络——网络层
  • 原文地址:https://www.cnblogs.com/del/p/1034523.html
Copyright © 2011-2022 走看看