是否和TObject与class的关系一样,默认是从iinterface继承的?

解决方案 »

  1.   

    是的,源码是这样
    type
      TObject = class;type
      IInterface = interface;class是所有类的祖先,interface就是所有接口的祖先
      

  2.   


    再来个问题,delphi里面在调试时,鼠标移到接口上面会显示 "XXClass as XXInterface"这样的信息。
    比如我有如下定义:type
      iForm1 = interface
        procedure asdf;
      end;
      iForm2 = interface(iForm1)
        procedure fdsa;
      end;
      TClass1 = class(TObject, IInterface)
        constructor Create;
        function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
        function _AddRef: Integer; stdcall;
        function _Release: Integer; stdcall;
        procedure asdf;
      end;
      TClass2 = class(TClass1, iForm2)
        constructor Create;
        procedure fdsa;
      end;
    执行函数
    procedure TForm1.btn24Click(Sender: TObject);
    var
      LIForm2: iForm2;
      Lcls2: TClass2;
      LIIntf: IInterface;
    begin
      Lcls2 := TClass2.Create;
      LIIntf := Lcls2;
      LIForm2 := iForm2(LIIntf);
      LIForm2.fdsa;
    end;  编译没问题,运行错误,调试时LIForm2显示TClass1($D40AB0) as IInterface,不知道问什么
    LIIntf := Lcls2;这句话没有将类型转换正确?
      

  3.   


    procedure TForm1.btn24Click(Sender: TObject);
    var
      LIForm2: iForm2;
      Lcls2: TClass2;
      LIIntf: IInterface;
    begin
      Lcls2 := TClass2.Create;
      LIIntf := Lcls2;//这句直接把接口缩小了服务范围
      LIForm2 := iForm2(LIIntf);//在LIIntf接口中已经找不到iForm1,iForm2中的方法了
      LIForm2.fdsa;//所以这里是找不到任何方法的.
    end;可以这样修改,Delphi中可以把所创建的类直接赋值给接口,然后执行接口.所以你上面是画蛇添足了.
    这样来写:
    var
      LIForm2:iForm2;
    begin
      LIForm2 := TClass2.Create;
      LIForm2.fdsa;
    end;
      

  4.   

    这个问题应该是Delphi编译时,对一些继承、实现的问题处理上不太好