C#では、次のような侵入型のツリー構造があります。
public abstract class Node
{
Container parent;
Node nextNode;
Node previousNode;
public abstract class Container : Node
{
Node firstChild;
Node lastChild;
}
}
ツリーに追加できるさまざまなオブジェクトは、子を持つことができるかどうかに応じて、Node
または子を継承します。Container
内部クラスを作成することにより、コンテナの子のリストを管理するためにContainer
のプライベートメンバーにアクセスできることを意味します。Node
これはすべてうまくいっています。しかし今、私はそれをジェネリックにして、型の安全性を維持しながら再利用できるようにしたいと思っています。基本的に、すべてのツリー機能をNodeの上のジェネリッククラスに移動し、NodeとContainerの間の別のクラスに移動します。これが私がやろうとしていることの大まかなデザインです:
public abstract class GenericNode<Node, Container>
where Node : GenericNode<Node, Container>
where Container : GenericNode<Node, Container>.GenericContainer
{
Container parent;
Node nextNode;
Node previousNode;
public abstract class GenericContainer : Node
{
Node firstChild;
Node lastChild;
}
}
GenericContainer
もちろん、継承元を作成できないため、これは機能しませんNode
(コンパイラエラーCS0689)。内部クラスの要件を削除しても(たとえば、internal
自分のライブラリを使用して注意するだけで)、同じ問題(およびエラー)が発生しない設計を理解することはできません。
(私はそうしなければならないとは思いませんでしたが、それを詳しく説明します。コンパイルエラーを「修正」しようとはしていません。また、単純なツリー実装を探していません。これはコンテナ設計の質問です。)
そして今、私は少し困惑しています。誰かがこれをどのように設計するかについてもっと良いアイデアを持っていますか?
編集:クラスを継承階層に「注入」する問題を回避するために拡張メソッドを使用しようとする、設計のもう1つの方法であるこの回答を必ず確認してください(ただし、残念ながら完全には機能しません)。