2010-06-02 17 views
7

Tôi muốn tạo một cấu trúc dạng xem hình ảnh hoàn toàn chung chung. một số điều như sau:Cách tạo một TreeView chung hoàn chỉnh giống như cấu trúc dữ liệu

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

như bạn có thể thấy trong nguồn lớp này, cha mẹ và cả trẻ em, tất cả đều có loại dữ liệu chung khác nhau. tôi cũng muốn xem cây của tôi có số lượng không giới hạn (không chỉ 3). bằng cách này khi tôi muốn làm việc với các nút của tôi trong mã, tất cả chúng sẽ được gõ mạnh mẽ. không chỉ các đối tượng mà tôi cần phải chuyển đổi chúng thành kiểu ban đầu của chúng.

có thể tạo loại cấu trúc này trong C#, một số lần xem trang mà tất cả các nút của nó được nhập mạnh không?

cảm ơn

+0

bạn vui lòng mô tả cách tôi có thể tạo nó –

+0

Bạn thậm chí muốn có loại khác nhau cho trẻ em khác nhau? –

+0

Có, tôi cần loại khác nhau của trẻ em khác nhau quá. –

Trả lời

2

Đây là vấn đề lớn với cấu trúc dữ liệu cây. Thật dễ dàng để xác định cây đồng nhất, nhưng trong thế giới thực, cây thường bao gồm các loại đối tượng không đồng nhất. Một ví dụ điển hình là một hệ thống tập tin, nơi cây có chứa các ổ đĩa, thư mục và tập tin.

Bạn chỉ có thể tạo một loại cây an toàn nếu bạn biết chính xác hình dạng của cây tại thời điểm biên dịch. Tất nhiên, điều này loại bỏ mọi trường hợp sử dụng thực tế cho cây cối.

2

Vâng, ngoài việc là cây, bạn sẽ có một số dữ liệu cơ bản. Ví dụ cây thư mục. Các thuộc tính của thư mục là tên của nó và một danh sách các thư mục con. Chúng tôi bắt đầu bằng cách xác định một số chung là 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;} 
} 

Vì vậy, một cây thư mục đơn giản chỉ là một TreeItem<string>:

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

Điều này sẽ tạo ra một cây như thế này:

root 
|- child1 
|- child2 
|- child3 

Cách duy nhất để làm cho một cái nhìn cây hoàn toàn chung là để có cùng loại cho nút hiện tại, nút ở trên và tất cả các nút con, nếu không bạn phải sửa cấu trúc tại thời gian biên dịch và chỉ hỗ trợ cấu trúc phân cấp đã đặt.

+0

Có Tôi biết cách tạo loại treeview này, khi tất cả các nút có cùng kiểu dữ liệu. nhưng câu hỏi của tôi là làm thế nào để làm cho nó với các loại dữ liệu khác nhau và cũng làm thế nào để làm cho nó gõ mạnh mẽ –

1

Sau khi đọc câu trả lời của Igors và bình luận của bạn và chỉ có thể nói điều này là không thể theo cách như vậy. Tất cả những gì bạn có thể làm là sử dụng T một số loại cơ sở mà tất cả các lớp đều có chung, như lớp cơ sở hoặc Giao diện.

Nhưng nếu bạn cần ở đâu đó trong mã của bạn loại cụ thể mà bạn sẽ cần phải cast nó có thể dẫn đến một số loại if-trả lại hoặc if-else-nếu cấu trúc như:

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

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

Nhưng đó là tất cả những gì bạn có thể làm.