는 다음 있다고 가정 :Delphi 인터페이스 상속 : 왜 조상 인터페이스의 멤버에 액세스 할 수 없습니까?
//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)
신경 끄시 고,이 아무것도 해결되지 않습니다.
FObject가 FChild 여야한다고 가정 할 수 있습니까? –
@Lieven, 감사합니다. 그 중 하나를 놓쳤습니다. 원본 소스에서 복사하여 명확하게하기 위해 이름을 변경했습니다. –
"property Object"를 "property Obj"로 변경 한 후 코드가 Delphi 2009에서 컴파일됩니다. – kludg