假设您有以下内容:
很明显编译器正在强制执行接口继承,因为除非实现了我可以通过在
//Note the original example I posted didn't reproduce the problem so
//I created an clean example
type
IParent = interface(IInterface)
['{85A340FA-D5E5-4F37-ABDD-A75A7B3B494C}']
procedure DoSomething;
end;
IChild = interface(IParent)
['{15927C56-8CDA-4122-8ECB-920948027015}']
procedure DoSomethingElse;
end;
TGrandParent = class(TInterfacedObject)
end;
TParent = class(TGrandParent)
end;
TChild = class(TParent, IChild)
private
FChildDelegate: IChild;
public
property ChildDelegate:IChild read FChildDelegate implements IChild;
end;
TChildDelegate = class(TInterfacedObject, IChild)
public
procedure DoSomething;
procedure DoSomethingElse;
end;
我认为这将允许您调用DoSomething
,但事实并非如此:
procedure CallDoSomething(Parent: TParent);
begin
if Parent is TChild then
TChild(Parent).DoSomething;
end;
很明显编译器正在强制执行接口继承,因为除非实现了
IParent
的成员,否则两个类都无法编译。尽管如此,编译器在实例化和使用类时无法解析IParent
的成员。
TMyClass
的类声明中显式包含IParent
来解决这个问题:TMyClass = class(TInterfacedObject, IChild, IParent)
算了,这不能解决任何问题。
Object
。 - Kenneth Cochran