[解决办法] 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 [解决办法] class of...类引用 和 class functiong/procedure... 有什么用??? ---可以不创建类实例,通过类名.名字 什么时候用??? --需要频繁调用的时候,而且不需要创建类实例的情况下 [解决办法]
[解决办法] 我是这样理解的 类引用 : class of 相当于一种类型的类; 不需要创建实例;就可以直接调用;运行时期实际类型未知的类 时; 类的方法 : class function 在实例化前就可以直接调用(不在private区域) [解决办法]
Delphi(Pascal) code
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 类型的, 这样可以避免类型冲突. 举例说明:} [解决办法] 类的类,让程序可以动态切换类 没有它,程序只可以动态切换对象