我有以下问题:为什么不为子类生成接口表?
- 一个基类,它实现某个接口
- 其从基类下降并覆盖接口方法
对于孩子类接口表另一类根本不生成。
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容器中,并解析父类所做的事情。 –