【发布时间】:2016-05-16 09:31:37
【问题描述】:
我有以下问题:
- 实现某个接口的基类
- 从基类派生并覆盖接口方法的另一个类
对于子类根本不生成接口表。
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 会告诉您,将接口方法声明为虚拟方法并在派生类中覆盖它与接口无关。你可以做到,但没用。如果需要更改派生类中的接口方法,则应在派生类中重新声明接口,并且更改的方法可以是静态的 - 无需将其设为虚拟。
-
这在速度方面是有道理的,但对我来说不是。所有类共享相同的接口,并且某些类可以覆盖方法。但无论如何问题都解决了——它在 IoC 容器中,解析父类就完成了。
标签: delphi interface polymorphism