假设在Delphi中你有以下这些类:
请注意,TClass1.Create不是虚拟的,并且TClass2和TClass3声明了一个非虚拟的构造函数。
假设我想从TClass3.Create中调用TClass1的Create构造方法,但不想调用TClass2.Create中的构造代码?在没有使用RTTI的情况下,这是否可能在语言内实现?
我认为没有这样的语法,但我想要的是:
我能提供的最接近的答案是这个,尽管这段代码已经编译通过,但是它会泄露一个对象,因为它使用了一个单独的TClass1.Create构造函数。
我认为在TClass3.Create中调用TClass1.Create的代码
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的代码
TClass1.Create
被编译通过,但这是错误的,因为它会泄漏一个对象。正确的方法是什么?更新请注意,David的答案只适用于没有虚构造函数的类层次结构,就像我最初提出的那样。如果您的代码具有虚构造函数并且TClass2和TClass3重写了它们,则他的答案将无法在您的代码中起作用。如果我问的问题涉及虚构造函数(或不是构造函数的虚方法),则答案是“除非使用非常丑陋的虚方法表技巧,否则根本无法实现”。还请注意,链接的“possible duplicate”不是重复的,因为当添加/删除虚方法时,答案会发生变化。
TSomeClass.Create
这样的调用会为一个实例分配内存,然后执行构造函数体,而像inherited Create
或SomeInstance.Create
这样的调用只会在已经存在的实例上执行函数体,因此TClass1.Create;
在我看来是行不通的。 - Uli GerhardtTClass1
和TClass2
是第三方的,而您正在编写TClass3
。对吗? - Uli Gerhardt