Предположим, что у вас есть следующее:
//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
при создании и использовании класса.
Я могу обойти это, явно включив IParent
в объявление класса
TMyClass
:
TMyClass = class(TInterfacedObject, IChild, IParent)
Nevermind, это ничего не работает.