2010-06-02 14 views
7

Tamamen genel bir ağaç görünümü benzeri yapı oluşturmak istiyorum. Bu gibi bazı şey: bu kitlesel kaynağı, ebeveyn ve ayrıca çocuklarda görebileceğiniz gibiTam bir genel TreeView veri yapısı gibi oluşturma

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

, tüm farklı jenerik veri türü var. Ayrıca ağaç görünümümün sınırsız sayıda seviyeye sahip olmasını istiyorum (sadece 3 değil). Bu şekilde, koddaki düğümlerimle çalışmak istediğimde, hepsi yazılacak. sadece orijinal türlerine dönüştürmem gereken nesneler değil.

Bu tür bir yapı, tüm düğümlerinin güçlü bir şekilde yazıldığı bir ağaç görünümünde C# olarak oluşturulabilir mi?

sayesinde

+0

Nasıl oluşturabileceğimi açıklar mısınız? –

+0

Farklı çocuklar için farklı türde olmak ister misiniz? –

+0

Evet, farklı türde farklı çocuklara da ihtiyacım var. –

cevap

2

Ağaç veri yapıları ile ilgili büyük sorun budur. Homojen ağaçları tanımlamak kolaydır, ancak gerçek dünyada ağaçlar genellikle heterojen nesne tiplerinden oluşur. Bunun iyi bir örneği, ağacın sürücüler, klasörler ve dosyalar içerdiği bir dosya sistemidir.

Derleme zamanında yalnızca ağacın şeklini biliyorsanız, yalnızca güvenli bir ağaç oluşturabilirsiniz. Elbette bu, ağaçlar için gerçek dünya kullanım durumlarını ortadan kaldırır.

2

Eh, ayrı bir ağaç olmaktan, bazı temel verilere sahip olur. Örneğin bir dizin ağacı. Dizinin nitelikleri, adı ve alt dizinlerin listesidir. Jenerik bir TreeItem tanımlayarak başlıyoruz.

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;} 
} 

Yani basit bir dizin ağacı sadece TreeItem<string> geçerli:

root 
|- child1 
|- child2 
|- child3 

tek yolu tamamen jenerik ağaç görünümü yapmak için:

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

Bu böyle bir ağaç yaratacak Geçerli düğüm, yukarıdaki düğüm ve tüm çocuk düğümleri için aynı türlere sahip olmak, aksi halde yapıyı derleme zamanında düzeltmeniz ve yalnızca ayarlanmış bir hiyerarşiyi desteklemeniz gerekir.

+0

Evet, tüm düğümler aynı veri türüne sahip olduğunda bu tür bir ağaç görünümü oluşturmayı biliyorum. ama benim sorum, farklı veri türleri ile nasıl yapılacağı ve nasıl yazıldığının nasıl yazılacağı ile ilgilidir. –

1

Igors cevabını ve yorumunuzu okuduktan sonra, bunun mümkün olmadığını söyleyebilirsiniz. Tek yapmanız gereken, tüm sınıfların bir ana sınıf veya bir Arabirim gibi ortak olduğu bazı taban türü olan T kullanıyor.

Ama kodunuzda yere gerekirse belirli tip bir çeşit yol açabilir döküm gerekir if-dönüş veya if-else-if yapısı gibi:

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

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

Ama bu yapabileceğin her şey.