• delphi 类方法、类变量、类常量、类属性的研究,自己的研究


    群里我师傅给我的答案:

    unit Unit4;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    
    type
      TForm4 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
      /// <summary>
      /// 我曾经容易犯的错误理解:
      ///    Tperson再全局静态内存中 肯定得有个实例 才能 调用 function啊
      ///
      /// 知识点:
      ///   类方法是不需要初始化实例的
      ///   创建实例的时候
      ///   不是的,class function 类似于全局函数,只是挂名在这个类下面
      ///   class function 是不能访问Self的
      ///   Self都没有,当然也不能访问成员变量了
      ///   class 是类的方面,没有实例,就没有self
      /// </summary>
      TPerson = class
        //类常量得写在这里
        const hehe1 = 'hehe1';
      private
        Fname: string;
        class var Fname1: string;
        procedure Setname(const Value: string);
        class procedure Setname1(const Value: string); static;
        public
          /// <summary>
          /// 实例方法
          /// </summary>
          function sayName(): string;
    
          /// <summary>
          /// 类方法----class function 类似于全局函数
          /// </summary>
          class function sayName1(): string;
    
          /// <summary>
          /// 实例变量
          /// </summary>
          var cde: string;
    
          /// <summary>
          /// 类变量-----按理说那就是全局变量了
          /// </summary>
          class var cde1: string;
    
          /// <summary>
          /// 实例常量
          /// </summary>
          const hehe = 'hehe';
    
          /// <summary>
          /// 类常量 ------ 全局常量了(但是不能写在这里,要写在上面,写在这里会报错)
          /// </summary>
          //class const hehe1 = 'hehe1';
    
          /// <summary>
          /// 实例属性
          /// </summary>
          property name: string read Fname write Setname;
    
          /// <summary>
          /// 类属性
          /// </summary>
          class property name1: string read Fname1 write Setname1;
      end;
    
    var
      Form4: TForm4;
    
    implementation
    
    {$R *.dfm}
    
    
    procedure TForm4.Button1Click(Sender: TObject);
    begin
      //TPerson.cde := 'wokao';这句会报错,因为没有实例 无法访问实例的变量
      TPerson.cde1 := 'wokao';
      ShowMessage(TPerson.cde1);
      ShowMessage(TPerson.hehe);//这句竟然也可以
      ShowMessage(TPerson.hehe1);
      //ShowMessage(TPerson.name);这句不可以
      ShowMessage(TPerson.name1);
    end;
    
    { TPerson }
    
    function TPerson.sayName: string;
    begin
      //实例方法即可以访问类属性也可以访问正常的属性
      name := 'wokao';
      name1 := 'wokao1';
    end;
    
    class function TPerson.sayName1: string;
    begin
      //类方法只能访问类属性
      name1 := 'wokao1';
      //这里会报错,因为没有实例,所以不能访问实例的属性.
      //name := 'wokao';
    end;
    
    procedure TPerson.Setname(const Value: string);
    begin
      Fname := Value;
    end;
    
    class procedure TPerson.Setname1(const Value: string);
    begin
      Fname1 := Value;
    end;
    
    end.
  • 相关阅读:
    算法提高 道路和航路
    奇偶剪枝
    二分求值
    并查集--路径压缩
    Oracle数据库导入导出DMP文件
    Spring IoC的实现与思考(一)
    sql基础拾遗
    jquery事件函数的使用之focus
    Java动态代理之cglib
    Java se之动态代理
  • 原文地址:https://www.cnblogs.com/del88/p/5966594.html
Copyright © 2020-2023  润新知