实现了派生interface的对象不支持基interface 本帖最后由 kingyo 于 2013-02-02 20:59:17 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Mark..我对Interface不了解,等高手! 你是基本概念混淆了, 仔细看书或者示例程序会有帮助procedure DoSome;var o : IDerive; //TMyObj; //你的程序改这句即可 ib : IBase;begin o := TMyObj.Create; ib := o; //Compile error! ib := o as IBase; //Runtime error!end; 我知道将TMyObject赋值给IDerived是可以的,也知道将TMyObject赋值给IBase是不可以的,我想知道为什么不可以。 回答一下你最开始的提问, 见代码注释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. 对象为空,对象的地址是否也为空? 高分悬赏,解谜之人。 如何在DBGRID中自动给记录所在的行中的一个字段赋值呢....现场给分 招聘 Delphi 程序高手!(上海) 怎样让dbgrid对数据库的数据即时更新? 怎样完全断开与数据库的连接? OnFieldChangeComplete事件中的参数怎么使用? delphi中没有SetClIpCursor这个API函数 小妹?^_^?:捉虫:捉虫delphi编译的速度问题? 两个程的绑定 delphi xe2 unidac连接mssql问题 Delphi 登陆网站
你是基本概念混淆了, 仔细看书或者示例程序会有帮助
procedure DoSome;
var
o : IDerive; //TMyObj; //你的程序改这句即可
ib : IBase;
begin
o := TMyObj.Create;
ib := o; //Compile error!
ib := o as IBase; //Runtime error!
end;
回答一下你最开始的提问, 见代码注释
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.