本帖最后由 kingyo 于 2013-02-02 20:59:17 编辑

解决方案 »

  1.   

    Mark..我对Interface不了解,等高手!
      

  2.   


    你是基本概念混淆了, 仔细看书或者示例程序会有帮助
    procedure DoSome;
    var
      o : IDerive; //TMyObj;  //你的程序改这句即可
      ib : IBase;
    begin
      o := TMyObj.Create;
      ib := o;  //Compile error!
      ib := o as IBase; //Runtime error!
    end;
      

  3.   

    我知道将TMyObject赋值给IDerived是可以的,也知道将TMyObject赋值给IBase是不可以的,我想知道为什么不可以。
      

  4.   


    回答一下你最开始的提问, 见代码注释
    unit Unit13;interfacetype
      IBase = interface
      ['{87698B00-30FC-49F6-9CAE-F8DE39773D94}']
        procedure ProcA;
      end;  IDerive = interface(IBase)
      ['{FB597533-3125-41B6-94D7-53A871097635}']
        procedure ProcB;
      end;  TMyObj = class(TInterfacedObject, IDerive)
      public
        procedure ProcA;
        procedure ProcB;
        procedure ProcC;
      end;
      procedure DoSome;
    implementationprocedure DoSome;
    var
      o : TMyObj;
      Base : IBase;
      Derive : IDerive;
    begin
      o := TMyObj.Create;
      try
        o.ProcA;
        o.ProcB;
        o.ProcC;    //以下两句无法通行, 因为TMyObj的接口不直接包含IBase, 无法越级向上转换. 和对象的向上转换不同.
        {Base := IBase(o);
        IBase(o).ProcA;
        }    //下边的就可以通行
        //////////////////////////////////////
        ///  IDerive是TMyObj的直接声明接口
        IDerive(o).ProcA;
        IDerive(o).ProcB;    Derive := IDerive(o);
        Derive.ProcA;
        Derive.ProcB;    ///  可以通过多次转换达到目的--IBase
        IBase(IDerive(o)).ProcA;    Base := IDerive(o);
        Base.ProcA;  finally
        o.Free;
      end;
    end;
    { TMyObj }procedure TMyObj.ProcA;
    beginend;procedure TMyObj.ProcB;
    beginend;procedure TMyObj.ProcC;
    beginend;end.