Suponga que tiene el siguiente:Herencia de interfaz Delphi: ¿Por qué no puedo acceder a los miembros de la interfaz ancestro?
//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;
Me gustaría pensar que esto permitiría que llame DoSomething
pero esto no parece ser el caso:
procedure CallDoSomething(Parent: TParent);
begin
if Parent is TChild then
TChild(Parent).DoSomething;
end;
Su claro que es el compilador imponiendo la herencia de la interfaz porque ninguna clase se compilará a menos que se implementen los miembros de IParent
. A pesar de esto, el compilador no puede resolver los miembros del IParent
cuando se crea una instancia de la clase y se utiliza.
puedo evitar esto incluyendo explícitamente IParent
en la declaración de clase de TMyClass
:
TMyClass = class(TInterfacedObject, IChild, IParent)
No importa, esto no funciona en torno a cualquier cosa.
¿Podemos suponer que FObject debería ser FChild? –
@Lieven, gracias. Perdí ese. Copié de la fuente original y cambié los nombres para hacerlo más claro. –
Después de cambiar "propiedad Objeto" a, por ejemplo, "propiedad Obj" el código se compila en Delphi 2009 – kludg