gpt4 book ai didi

delphi - 是否可以对非虚拟构造函数或方法的层次结构进行 "super inherited constructor"调用?

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

假设在 Delphi 中你有这些类:

type
TClass1 = class
public
constructor Create;
end;

TClass2 = class(TClass1)
public
constructor Create;
end;

TClass3 = class(TClass2)
public
constructor Create;
end;

请注意,TClass1.Create 不是虚拟的,并且 TClass2 和 TClass3 声明的构造函数也不是虚拟的。

假设我想从 TClass3.Create 中调用 TClass1 的 Create 构造函数方法,但不调用 TClass2.Create 中的构造函数代码?在不依赖 RTTI 的语言中这是否可能?

我不认为有这样的语法,但我想要的是:

constructor TClass3.Create;
begin
super inherited Create; // Invoke TClass1.Create
end;

我能得到的最接近的是这个,它编译但只是泄漏一个对象,因为它正在执行单独的 TClass1.Create 构造。

constructor TClass3.Create;
begin
TClass1.Create; // returns new TClass1, discards and leaks it.
// other initialization here.
end;

在我看来,TClass3.Create 中的代码 TClass1.Create 调用编译,我不能称其为正确的,它是错误的,因为它泄漏了一个对象。正确的正确方法是什么?

更新 请注意,David 的答案仅适用于没有虚拟构造函数的类层次结构,正如我最初所要求的那样。如果您有虚拟构造函数并且 TClass2 和 TClass3 覆盖了它们,那么他的答案在您的代码中不起作用。如果我用虚拟构造函数(或不是构造函数的虚拟方法)问上述问题,答案将是“你根本无法做到这一点,除非通过真正粗暴的虚拟方法表黑客”。另请注意,链接的“可能重复”不是重复,因为当您从情况中添加/减去虚拟方法时,答案会发生变化。

最佳答案

没有语法支持跳过继承层次结构的一层。您可以做您想做的事情的唯一方法是这样的:

TClass1(Self).Create;

一个完整的示例程序来演示:

type
TClass1 = class
constructor Create;
end;

TClass2 = class(TClass1)
constructor Create;
end;

TClass3 = class(TClass2)
constructor Create;
end;

constructor TClass1.Create;
begin
Writeln('TClass1');
end;

constructor TClass2.Create;
begin
inherited;
Writeln('TClass2');
end;

constructor TClass3.Create;
begin
TClass1(Self).Create;
Writeln('TClass3');
end;

begin
TClass3.Create;
Readln;
end.

输出

TClass1TClass3

关于delphi - 是否可以对非虚拟构造函数或方法的层次结构进行 "super inherited constructor"调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123122/

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