我有以下代码:
program ClassConstructor;
{$apptype console}
type
TTree<K,V> = class(TObject)
protected type
TNode = class(TObject)
end;
TNodeType = class of TNode;
protected
class var NodeType: TNodeType;
end;
TThreadedTree<K,V> = class(TTree<K,V>)
protected type
TThreadedNode = class(TTree<K,V>.Tnode)
end;
protected
class constructor Init;
end;
TRBThreadedTree<K,V> = class(TThreadedTree<K,V>)
private
class constructor Init;
end;
class constructor TThreadedTree<K,V>.Init;
begin
NodeType:= TThreadedNode;
WriteLn('Class constructor for the plain threaded tree has run');
end;
class constructor TRBThreadedTree<K,V>.Init;
begin
NodeType:= TThreadedNode;
WriteLn('Class constructor for the RedBlack threaded tree has run');
end;
var
Test: TThreadedTree<integer, integer>;
RBTest: TRBThreadedTree<integer, integer>;
begin
Test:= TThreadedTree<integer, integer>.Create;
RBTest:= TRBThreadedTree<integer, integer>.Create;
WriteLn('I see nothing');
Readln;
end.
这个想法是我有一个普通的树祖先类型Parented
和Threaded
后代,它有 RB、BST 和 AVL 子类型。
为了尽可能地抽象线程/父节点,我希望NodeType
在类构造函数中初始化,以便我可以调用。
NewNode:= NodeType.Create(Key, Value, Parent);
而不必弄清楚它是父节点还是线程节点。
问题
为什么从不调用类构造函数?
不是继承的类构造函数,甚至不是类型本身的类构造函数。
我知道我可以在构造函数中进行这个初始化,但是让我很恼火的是类构造函数没有运行。
这是一个错误还是我错过了什么?
顺便说一句,我使用的是 Delphi 10,但 XE7 显示了相同的行为。