我有以下問題:爲什麼不爲子類生成接口表?
- 一個基類,它實現某個接口
- 其從基類下降並覆蓋接口方法
對於孩子類接口表另一類根本不生成。
type
ITest = interface
['{69068A88-6712-40E0-B1E3-DA265F7428EA}']
procedure Test;
end;
TBase = class(TInterfacedObject, ITest)
protected
procedure Test; virtual;
public
constructor Create;
end;
TChild = class(TBase)
protected
procedure Test; override;
end;
constructor TBase.Create;
begin
Assert(GetInterfaceTable <> nil);
end;
因此使用下面的結構時:
var
X: ITest;
begin
X := TChild.Create;
end;
我得到的斷言失敗。
因此我知道我需要重新聲明類聲明中的接口來解決此問題。但是,這是一個語言功能或編譯器老問題?
因爲在編譯時編譯器知道TChild正在實現ITest接口。但是一旦我們進入運行時,我需要從基地重複聲明接口!我們爲什麼要這樣做?對我來說,它看起來越野車。
David Heffernan會告訴你,聲明一個接口方法是虛擬的,並在派生類中重寫它與接口無關。你可以做到但沒用。如果您需要更改派生類中的接口方法,則應重新聲明派生類中的接口,並且更改的方法可以是靜態的 - 無需使其變爲虛擬。 – kludg
這是有道理的速度的方式,但不是在我的情況。所有類共享相同的接口,並且有些類可以覆蓋這些方法。但無論如何,問題解決了 - 它是在IoC容器中,並解析父類所做的事情。 –