zoukankan      html  css  js  c++  java
  • Delphi Class of 类引用

    Delphi Class of 类引用也就是类的类型,也可说是指向类的指针

    Type
    TControlCls = Class of TControl;
    function CreateComponent(ControlCls: TControlCls): TControl;
    begin
    result:=ControlCls.Create(Form1);
    ...
    end;

    function CreateComponent(ControlCls: TControl): TControl;
    begin
    result:=ControlCls.Create(Form1);
    ...
    end;

    前者要求传入一个类, 而后者要求传入一个对象(类的实例)

    type
    MyClassRef=calss of CMyClass //表示MyClassRef为指向CMyClass或其父类的指针

    类的引用就像指向类的指针一样
    类引用就是类的类型,可以声明一个类引用变量赋给它一个类,可以通过这个变量创建对象的实例。

    类之类
    当你不确定调用的类模型时候用到类之类。
    也可以说是类指针~
    =============================================
    关于class of书上有详细介绍。

    引用里面的原话:在程序编译时期,想要利用类别名称或特件来呼叫类别方法。或虚拟建构函式,可是却又不知道类别或物件的真正资料型别,这时候类别参考就非常有用了
    =============================================
    System单元的TObject有如下方法:
    function ClassType: TClass;

    它就是获取对象的类类型,它的返回类型TClass就是class of TObject。

    因为所有类都派生自TObject,所以所有对象都可以调用ClassType。比如:

    procedure TForm1.Button1Click(Sender: TObject);
    var
    S: TStringList;
    C: TClass;
    begin
    S := TStringList.Create;

    C := S.ClassType;
    ShowMessage(C.ClassName);//对话框会显示出来TStringList,相当于TStringList.ClassName

    S.Free
    end;


    而C.ClassName调用的是TObject的类方法ClassName,
    原型:class function ClassName: ShortString;

    就是说不需要用实例化的对象去调用,直接用类去调用就行了;不过用对象调用也是可以的,因为对象空间也保存了类的VMT地址。

    用类调用形如:TStringList.ClassName
    用对象调用形如:S.ClassName
    =============================================
    这段书上的话估计翻译自Delphi的帮助文档:
    Class-reference types are useful when you want to invoke a class method or virtual constructor on a class or object whose actual type is unknown at compile time.
    我上次翻译成这样了,应当不对:
    类引用类型是有用的,当你想调用一个“类方法”或当你想调用在编译时期实际类型未知的一个类或对象的虚构造器的时候。
    ============================================
    我是这样理解的
    类引用 : class of 相当于一种类型的类; 不需要创建实例;就可以直接调用;运行时期实际类型未知的类 时;
    类的方法 : class function 在实例化前就可以直接调用(不在private区域)

    var
    List: TStrings;
    i: Integer;
    begin
    List := TStringList.Create;
    for i := 0 to 99 do
    List.Add(IntToStr(i));
    Memo1.Lines := List;
    List.Free;
    end;

    {
    TStrings 类中包含了抽象方法, 但这些抽象方法在其子类 TStringList 中都得到了实现; 因此, 我们虽然定义的是 TStrings 类的变量, 却要通过 TStringList 来实现.
    这里就有个问题, 我们直接使用 TStringList 不行吗? 为什么还要绕个弯?
    我觉得是: 这样才更符合"多态"的思想吧;
    仅就本例而言 Memo1.Lines 本身就是 TStrings 类型的, 这样可以避免类型冲突. 举例说明:
    }

    ============================================
    类的类,让程序可以动态切换类
    没有它,程序只可以动态切换对象

  • 相关阅读:
    单例模式
    HashSet、LinkedHashSet、SortedSet、TreeSet
    ArrayList、LinkedList、CopyOnWriteArrayList
    HashMap、Hashtable、LinkedHashMap
    andrew ng machine learning week8 非监督学习
    andrew ng machine learning week7 支持向量机
    andrew ng machine learning week6 机器学习算法理论
    andrew ng machine learning week5 神经网络
    andrew ng machine learning week4 神经网络
    vue组件监听属性变化watch方法报[Vue warn]: Method "watch" has type "object" in the component definition. Did you reference the function correctly?
  • 原文地址:https://www.cnblogs.com/yzryc/p/6396164.html
Copyright © 2011-2022 走看看