1、你那本书应该说错了。TABC是指向TObject类型的指针,即TABC可以代表Delphi中任意类的类型。
使用方法
var
  a: TABC;
  b: TObject;  a = TList;
  b := a.Create;2、class method相当于C++中的static函数。所以无论对象实例是否创建。

解决方案 »

  1.   

    谢谢chechy的回答
    1.var
      a: TABC;
      b: TObject;  a = TList;
      b := a.Create;
    您的意思是不是代表a是百变金刚,只要它指向的是TObject或Tobject的派生类,都可以转换可以利用as操作,请指点
    2."class method相当于C++中的static函数。所以无论对象实例是否创建。" 这个我是知道的,但是我想知道,比如我要自己创建一个类,写方法时,什么该用类方法,什么用对象方法
      

  2.   

    1、未必。我举的例子就故意没有使用TComponent,原因在于TObject没有TComponent的建构函数create(AOwner: TComponent);所以需要根据具体情况定义。
    2、这个情况和你在C++碰到的情况一样。一般来说,静态方法很少定义,而且不能使用类中的其它成员变量和方法(静态方法除外)。
      

  3.   

    其实构造函数本身就是一类方法
    看源码时可以看到对于TObject的ClassName类方法
    class function TObject.ClassName: ShortString;
    begin
      Result := PShortString(PPointer(Integer(Self) + vmtClassName)^)^;
    end;而如果用普通的对象方法,假如在TForm1中则需要
    function TForm1.ClassNameSecond: ShortString;
    begin
      Result := PShortString(PPointer(Integer(Pointer(Self)^) + vmtClassName)^)^;
    end;也就是说在类方法中的Self即为指向该类型的指针,指向了一个VMT表格,里面包含了许多有关于
    该类信息的入口
    而在普通得对象方法中,Self就为指向该对象实例的指针,而开头的四个字节中存放的是才是指向
    该类类型的指针
    这是我的一点理解,不知对否
      

  4.   

    谢谢chechy,明白了.
    但Borland的那些天才程序员为什么要创造TABC这种类类型指针呢,只是为了灵活吗?
    请大家积极讨论,分不够可以再加,up也给分.
      

  5.   

    如果编写复杂的程序确实需要。当你写程序写道一定程度的时候,就会觉得它非常有必要一样。就如RTTI一样。
    一个大家常用的例子
    Application.CreateForm(TForm1, Form1);
    其中第一个参数就是类型指针。
      

  6.   

    谢谢xzgyb(老达摩)
    类方法应该就是向您所说的.
      

  7.   

    不谢,呵呵
    正象chechy老大说的那样
    近日正在看<<delphi高级开发指南>>
    中的RTTI的一章,对于取得一个类的类型信息,ClassInfo这个方法就很总要了,它就是这个
    类的类型信息的入口点,另外Delphi的类型系统需要保存一份在各种情况下如何构建给定类型
    的完整描述,也就是这个类指针, 以前看书好像看到过,但你拖一个控件放在窗体上时
    delphi会自动为你注册上也就是调用RegisterClass,当Delphi读取dfm文件时,会用GetClass
    来取得这个类指针,看一下TReader的ReadComponent就会了解,对于我们实际用处方面,象<<Delphi5开发人员指南>>有一节就是把窗体做在包中,并在Initialization用RegisterClass注册上,
    然后作为一个包装的窗体用FindClass找到在创建,这样就把程序分成了各个包,也大大增加了
    程序的扩展性
      

  8.   

    一个例子,原来我们写软件,定义一个基类Frame TfraBase:
    TfraBase = class(TFrame)
    ,然后从fraBase继承若干frame:
    TfraPlan = class(TfraBase)
    TfraInut = class(TfraBase)
    TfraSet = class(TfraBase)各个Frame需要切换,如果没有用类中类的话,就需要:var fraMain:TfraBase;
    Case Flag of
      1:fraMain := TfraInut.Create(self);
      2:fraMain := TfraSet.Create(self);
      ...
    end;用类中类的话:
    TXFrameClass = class of TFrame;
    procedure ShowActiveFrame(var fraMain:Tframe;fraClass:TXFrameClass)
    begin
      fraMain:=fraClass.Create(Self);
    end;调用:
    ShowActiveFrame(fraMain,TfraPlan);
      

  9.   

    我也贴一段
    type
      Form1Class= class of TForm1;
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
           class function Execute(formtype:form1class;AOwner: TComponent): integer; virtual;
     { Public declarations }
      end;  TForm2 = class(TForm1)
      public
        constructor Create(AOwner: TComponent); override;
      end;
    var
      Form1: TForm1;implementation{$R *.DFM}//产生什么类型的窗体,就把他的类名传进去.
    class function TForm1.Execute(formtype:form1class;AOwner: TComponent): integer;
    var
        Form: TForm1;
    begin
        Form := formtype.Create(AOwner);  //这里如何调用TForm1的子类?
        with Form do
        try
            ShowModal;
        finally
            Release;
        end;
    end;//显示form2
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Form2.Execute(tform2,Self) ;
    end;{ TForm2 }constructor TForm2.Create(AOwner: TComponent);
    begin
      inherited;
      caption:='form2';
    end;//显示form1
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     Form1.Execute(tform1,Self) ;
    end;