gpt4 book ai didi

delphi - 为什么没有为子类生成接口(interface)表?

转载 作者:行者123 更新时间:2023-12-03 15:54:04 25 4
gpt4 key购买 nike

我有以下问题:

  • 一个实现特定接口(interface)的基类
  • 从基类派生并重写接口(interface)方法的另一个类

对于子类,根本不生成接口(interface)表。

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;

我发现断言失败。

所以我确实知道我需要在类声明中重新声明接口(interface)来解决这个问题。但这是语言特性还是编译器的老问题了?

因为在编译时编译器知道 TChild 正在实现 ITest 接口(interface)。但是一旦我们进入运行时,我确实需要从基础对接口(interface)进行重复的重新声明!我们为什么要这样做?对我来说它看起来有问题。

最佳答案

据记录GetInterfaceTable返回该类的接口(interface)条目列表。在您的情况下,TChild 本身没有实现任何接口(interface)。

Returns a pointer to a structure containing all of the interfaces implemented by a given class.

GetInterfaceTable returns the interface entries for the class. This list contains only interfaces implemented by this class, not its ancestors. To find the ancestor list, iteratively call ClassParent and then call GetInterfaceTable on the value it returns. To find the entry for a specific interface, use the GetInterfaceEntry method instead.

GetInterfaceTable 是类函数,就像ClassName 是类函数一样。它取决于实例类,而不取决于您从代码的哪一部分调用它:

如果您运行以下代码,无论您是否在 TBase 构造函数中调用代码,它都会为您提供不同的 ClassName

constructor TBase.Create;
begin
writeln(ClassName);
end;

var
x : ITest;

X := TBase.Create; // outputs TBase
X := TChild.Create; // outputs TChild

关于delphi - 为什么没有为子类生成接口(interface)表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37250717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com