0

次のコードがあります。

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 は同じ動作を示します。

4

0 に答える 0