16,748
社区成员
发帖
与我相关
我的任务
分享
type
IBase = interface
['{87698B00-30FC-49F6-9CAE-F8DE39773D94}']
end;
IDerive = interface(IBase)
['{FB597533-3125-41B6-94D7-53A871097635}']
end;
TMyObj = class(TInterfacedObject, IDerive)
end;
procedure DoSome;
var
o : TMyObject;
ib : IBase;
begin
o := TMyObject.Create;
ib := o; //Compile error!
ib := o as IBase; //Runtime error!
end;
TMyObj = class(TInterfacedObject, IDerive)
TMyObj = class(TInterfacedObject, IBase, IDerive) //非得这么写?
unit Unit13;
interface
type
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;
implementation
procedure 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;
begin
end;
procedure TMyObj.ProcB;
begin
end;
procedure TMyObj.ProcC;
begin
end;
end.
procedure DoSome;
var
o : IDerive; //TMyObj; //你的程序改这句即可
ib : IBase;
begin
o := TMyObj.Create;
ib := o; //Compile error!
ib := o as IBase; //Runtime error!
end;