次のコードがあります。
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.
アイデアは、RB、BST、および AVL サブタイプを持つ単純なツリーの祖先タイプParented
と子孫を持っているということです。
スレッド/親ノードを可能な限り抽象化するために、クラス コンストラクターで を初期化して呼び出すことができるようにしたいと考えています。Threaded
NodeType
NewNode:= NodeType.Create(Key, Value, Parent);
親ノードかスレッド ノードかを判断する必要はありません。
質問
クラスコンストラクターが呼び出されないのはなぜですか?
継承されたクラス コンストラクターではなく、型自体のクラス コンストラクターでさえありません。
コンストラクターでこの初期化を実行できることはわかっていますが、クラス コンストラクターが実行されないことに腹を立てるだけです。
これはバグですか、それとも何か不足していますか?
ところで、私は Delphi 10 を使用していますが、XE7 は同じ動作を示します。