7

構造のような完全に一般的なツリービューを作成したいと思います。このようなもの:

public class TreeView<T, K, L>
{
    public T source;
    public K parent;
    public List<L> children;
}

このクラスソースでわかるように、親と子はすべて、異なるジェネリックデータ型を持っています。また、ツリービューに無制限の数のレベル(3つだけではない)を持たせたいです。このようにして、コード内のノードを操作する場合、すべてのノードが強く型付けされます。元のタイプに変換する必要があるオブジェクトだけではありません。

すべてのノードが強く型付けされているツリービューであるc#でこの種の構造を作成することは可能ですか?

ありがとう

4

3 に答える 3

2

さて、ツリーであることとは別に、いくつかの基礎となるデータがあります。たとえば、ディレクトリツリー。ディレクトリの属性は、その名前と子ディレクトリのリストです。ジェネリックを定義することから始めTreeItemます。

public class TreeItem<T> {
  public TreeItem() {
    Children = new List<TreeItem<T>>();
  }

  public void AddChild(T data) {
    Children.Add(new TreeItem<T>{Data = data, Parent = this});
  }

  public List<TreeItem<T>> Children{get;set;}
  public TreeItem<T> Parent {get;set;}
  public T Data {get;set;}
}

したがって、単純なディレクトリツリーは単なるTreeItem<string>:です。

var directories = new TreeItem<string> { Data="root" };
directories.AddChild("child1");
directories.AddChild("child2");
directories.AddChild("child3");

これにより、次のようなツリーが作成されます。

root
|- child1
|- child2
|- child3

完全に汎用的なツリービューを作成する唯一の方法は、現在のノード、上のノード、およびすべての子ノードに同じタイプを設定することです。それ以外の場合は、コンパイル時に構造を修正し、設定された階層のみをサポートする必要があります。

于 2010-06-02T06:30:33.500 に答える
2

これは、ツリーデータ構造の大きな問題です。同種のツリーを定義するのは簡単ですが、現実の世界では、ツリーは異種のオブジェクトタイプで構成されていることがよくあります。この良い例は、ツリーにドライブ、フォルダ、およびファイルが含まれているファイルシステムです。

コンパイル時にツリーの形状を正確に知っている場合にのみ、タイプセーフツリーを作成できます。もちろん、これにより、実際のツリーのユースケースがすべて排除されます。

于 2010-06-08T01:24:20.313 に答える
1

Igorsの回答とあなたのコメントを読んだ後、これはそのような方法では不可能であると言うことができます。できることはT、基本クラスやインターフェイスなど、すべてのクラスに共通する基本タイプとして使用することだけです。

ただし、コードのどこかに特定の型が必要な場合は、それをキャストする必要があります。これにより、次のようなif-returnまたはif-else-if構造が発生する可能性があります。

SpecificType specType = commonType as SpecificType;
if(specType != null)
{
    //Do something...
    return;
}

AnotherSpecifcType specType2 = commonType as AnotherSpecifcType;
if(specType2 != null)
{
    //Do something...
    return;
}

しかし、それがあなたにできることのすべてです。

于 2010-06-02T07:15:45.033 に答える