在很多书上都提到类引用,就象上面这种形式.由于那些解释都是很难懂的,现在我还是一知半解.恳请勇士用最简单的语言解释一下,先重谢了.

解决方案 »

  1.   

    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.(翻译的不好是主要原因,建议你仔细看看help)
      

  2.   

    谢谢上面的朋友.我平时看HELP的比较少.主要是英语查,看得太慢了.我刚学DELPHI时看了很多技巧方面的东西,其实一些基本概念都不清楚,现在觉得头脑里很混乱.好郁闷哟.我以前看的书真是些垃圾,现在我都在这儿来学了.
      

  3.   

    看帮助at times it is necessary to declare variables or parameters that take classes as values, and in these situations you need class-reference types.……A class-reference type, sometimes called a metaclass, is denoted by a construction of the formclass of typewhere type is any class type. The identifier type itself denotes a value whose type is class of type. If type1 is an ancestor of type2, then class of type2 is assignment-compatible with class of type1. Thustype TClass = class of TObject;var AnyObj: TClass;declares a variable called AnyObj that can hold a reference to any class. (The definition of a class-reference type cannot occur directly in a variable declaration or parameter list.) You can assign the value nil to a variable of any class-reference type.
    To see how class-reference types are used, look at the declaration of the constructor for TCollection (in the Classes unit):type TCollectionItemClass = class of TCollectionItem;  ...
    constructor Create(ItemClass: TCollectionItemClass);This declaration says that to create a TCollection instance object, you must pass to the constructor the name of a class descending from TCollectionItem.
    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.
      

  4.   

    它是一个类引用类型,或者说类的类型。它最典型的用在参数中,用来传递一个类而不是类实例,如:
    function CreateOneForm(FormClass: TFormClass): TForm;
    begin
      Result := FormClass.Create(nil);
    end;
    定义TClass =class of TObject 后,TClass和TObject都可以用来声明类实例,但是TClass还可以用来声明类引用类型的参数。
    var
      Obj: TClass;
    和Obj: TObject;所声明的Obj是完全一样的。
      

  5.   

    啊啼,啊啼,呵呵,老阿德,我现在看到你也要哭了,呵呵呵呵!!!!俺知道的不多,把自己的体会简单的说一下:类引用可以看做一种特殊类型的引用,而至于引用和指针,我想肯定是有区别的,否则Borland也不会把他们用不同的英文单词表示出来(引用是Reference,指针是Pointer)。不过我一般理解还是把这两个东西看做一个东西,即存放指针的一种独立的类型。既然叫做类引用,那么他里面存放的肯定是类的入口地址了!(不知道我的理解对否?呵呵)那么类的入口地址是什么呢,我想就是VMT(Virtual Method Table)的入口地址,估计就是偏移地址为零的地址。所以,个人认为类引用就是指向类的指针(确切说应该是引用!)我们知道,Delphi中的对象都是建立在堆中的,而堆中对象实体的VPTR就是指向VMT的,所以我认为这个VPTR说白了就是类引用,只不过他被融合到对象实体这个结构中而已,实际他们的性质是一样的!(请大家指正!呵呵...)好了,我把我知道的都说了,够无私的了吧!!!!呵呵......接下来,我借楼主的帖子也问个问题(省分了,呵呵!!!!):我们在公布部分申明的属性存放在什么地方(应该不是在VMT中)!?请各位指教!!!!谢谢......
      

  6.   

    To lxpbuaa(桂枝香在故国晚秋):  类引用我记忆中好象也可以用于多态,是吧????
      

  7.   

    类引用,它暗示代码是对类本身进行处理。第一点需要注意的是,类的引用不是类,也不是对象,
    更不是对象的引用,它只是对类的类型引用。
    type
      TMyClassRef=class of TMyClass;
    这样就可以声明两个类型的变量,
    第一个变量引用对象,
    第二个引用类:
    aClassRef:TMyClassReg;
    AnObject:TMyClass;
    begin
      aClassRef:=TMyClass; 
      AnClass:=TMyClass.Create;
    end;
      

  8.   

    同意一刀的说法,其实我上面的帮助没贴完,还落了几句,大意就是如果在类的本身定义一个变量而不是在它的实例中定义的话就要用这个玩意儿,
      FrameSniper ,
      
      你小子这几天跑那去了?MM还没搞定?属性存放在什么地方还没搞定?   还有心情哭?  
      

  9.   

    类引用为一个指针,指向一个类型,具体就是VMT。也可以说VMT也是类型
    TOBJECT.CLASSTYPE就是这个指针,实际上任何一个对象的PINTEGER(@OBJECT)指的也就是这个对象的VMT也是TOBJECT.CLASSTYPE
    function TObject.ClassType: TClass;
    begin
      Pointer(Result) := PPointer(Self)^;
    end;