2012-12-15 19 views
6

Tôi gặp một chút khó khăn trong việc hiểu cách mô hình Thùng chứa/Thành phần tương tác với nhau trong C#. Tôi nhận được cách Component chứa một đối tượng Site có thông tin về Container và Component. Nhưng, giả sử tôi có mã sau:Làm việc với System.ComponentModel

using System; 
using System.ComponentModel; 

public class Entity : Container { 
    public string Foo = "Bar"; 
} 

public class Position : Component { 
    public int X, Y, Z;  
    public Position(int X, int Y, int Z){ 
     this.X = X; 
     this.Y = Y; 
     this.Z = Z; 
    } 
} 

public class Program { 

    public static void Main(string[] args) { 

     Entity e = new Entity(); 
     Position p = new Position(10, 20, 30); 

     e.Add(p, "Position");    

    }  

} 

Điều này không có vấn đề, nó định nghĩa Vùng chứa (Thực thể) và Thành phần (Vị trí) được chứa bên trong nó.

Tuy nhiên, nếu tôi gọi p.Site.Container, nó sẽ trả về Thực thể, nhưng như IContainer. Đó là, tôi sẽ phải làm một cái gì đó rõ ràng như (Console.WriteLine(p.Site.Container as Entity).Foo); nếu tôi muốn truy cập Foo. Điều này có vẻ khá cồng kềnh.

Tôi có thiếu thứ gì đó hay có cách nào tốt hơn để làm những gì tôi muốn?

Trả lời

2

Bạn không bỏ lỡ bất cứ điều gì. Không có hợp đồng giao diện nào về thành phần chứa trong thành phần. Nếu bạn muốn hạn chế những loại thành phần có thể được thêm vào container bạn có thể quá tải phương thức Add và làm một kiểm tra của các loại thành phần được bổ sung:

public class Entity : Container { 
    public string Foo = "Bar"; 

    public virtual void Add(IComponent component) { 
     if (!typeof(Position).IsAssignableFrom(component.GetType())) { 
      throw new ArgumentException(...); 
     } 
     base.Add(component); 
    } 
} 
+0

Vì vậy, về cơ bản, chứ không phải là chấp nhận bất kỳ IComponent, đòi hỏi phải có phiên bản chuyên biệt hơn của nó có những gì tôi đang tìm kiếm? Bây giờ có sự khác biệt lớn giữa ví dụ về kiểm tra kiểu của bạn, trái ngược với việc nói, yêu cầu loại chung với một ràng buộc kiểu? Tôi sẽ giả định có, nhưng sự tinh tế bị mất trên tôi vào lúc này. –

+1

Nó có thể là tốt đẹp để áp dụng generics cho kịch bản này, nhưng tiếc là generics đã được giới thiệu trong .NET 2.0 nhưng ComponentModel là từ .NET 1.0 nên generics không có sẵn. – Eilon

+0

@Eilon, tại sao không chỉ sử dụng toán tử 'is'. Nó sẽ sạch hơn nhiều so với 'IsAssignableFrom'. – Jordan

Các vấn đề liên quan