2010-06-23 29 views
5

Tôi có hai đối tượng MetaItems và Items.C# generics và bộ sưu tập

MetaItem là mẫu cho các đối tượng và Các mục chứa giá trị thực. Ví dụ: "Department" được coi là meta-item và "Sales", "UK Region", "Asia Region" được coi là mục.

Ngoài ra, tôi muốn duy trì mối quan hệ cha-con đối với các mục meta và mục này. đang

Tôi đã sau cho cùng -

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace WpfApplication12 
{ 
    public interface IEntity 
    { 
     int Id { get; set; } 

     string Name { get; set; } 
    } 

    public interface IHierachy<T> 
    { 
     IHierachy<T> Parent { get; } 

     List<IHierachy<T>> ChildItems { get; } 

     List<IHierachy<T>> LinkedItems { get; } 

    } 

    public class Entity : IHierachy<IEntity>, IEntity 
    { 

     #region IObject Members 

     private int _id; 
     public int Id 
     { 
      get 
      { 
       return _id; 
      } 
      set 
      { 
       _id = value; 
      } 
     } 

     private string _name; 

     public string Name 
     { 
      get 
      { 
       return _name; 
      } 
      set 
      { 
       _name = value; 
      } 
     } 

     #endregion 

     #region IHierachy<IEntity> Members 

     public IHierachy<IEntity> _parent; 
     public IHierachy<IEntity> Parent 
     { 
      get 
      { 
       return _parent; 
      } 
     } 

     private List<IHierachy<IEntity>> _childItems; 

     public List<IHierachy<IEntity>> ChildItems 
     { 
      get 
      { 
       if (_childItems == null) 
       { 
        _childItems = new List<IHierachy<IEntity>>(); 
       } 
       return _childItems; 
      } 
     } 

     private List<IHierachy<IEntity>> _linkedItems; 

     public List<IHierachy<IEntity>> LinkedItems 
     { 
      get 
      { 
       if (_linkedItems == null) 
       { 
        _linkedItems = new List<IHierachy<IEntity>>(); 
       } 
       return _linkedItems; 
      } 
     } 
     #endregion 
    } 


    public class Item : Entity 
    { 
    } 

    public class MetaItem : Entity 
    { 
    } 

} 

Tiếp theo là lớp thử nghiệm của tôi -

public class Test 
{ 
    public void Test1() 
    { 
     MetaItem meta1 = new MetaItem() { Id = 1, Name = "MetaItem1"}; 

     MetaItem meta2 = new MetaItem() { Id = 1, Name = "MetaItem 1.1"}; 

     Item meta3 = new Item() { Id = 101, Name = "Item 1" }; 


     **meta1.ChildItems.Add(meta3);** // this line should not compile. 
     meta1.ChildItems.Add(meta2) // This is valid and gets compiled. 
    } 
} 

Trong lớp thử nghiệm, khi tôi buidling mối quan hệ cha-con, tôi có thể thêm mục như một đối tượng con cho đối tượng meta-item. Ở đây tôi muốn tạo ra lỗi biên dịch.

Ai đó có thể giúp tôi đạt được điều này.

-Regards Raj

+0

Nếu một mục meta chỉ là một mục có chứa các mục khác, thì không phải nó thực sự chỉ là một khoản mục dù sao, ở đâu 'T = mục'? –

+2

Không liên quan đến câu hỏi của bạn, nhưng đối với Entity.Id và Tên, các thuộc tính được tự động triển khai là bạn của bạn. – dahlbyk

Trả lời

0

Tại sao bạn không nghĩ dòng đó nên biên dịch? Nó trông hoàn toàn hợp lệ.

Danh sách ChildItems được công khai. Nếu bạn không muốn họ có thể thêm vào danh sách thì bạn sẽ cần phải quấn bộ sưu tập của riêng bạn hoặc sử dụng ReadOnlyCollection<IHierachy<IEntity>>.

Ồ, bạn đã sửa câu hỏi của mình. Tôi nghĩ rằng giải pháp là làm cho lớp Entity chung chung.

using System.Collections.Generic; 

namespace WpfApplication12 
{ 
    public interface IEntity 
    { 
     int Id { get; set; } 
     string Name { get; set; } 
    } 

    public interface IHierachy<T> 
    { 
     IHierachy<T> Parent { get; } 
     List<IHierachy<T>> ChildItems { get; } 
     List<IHierachy<T>> LinkedItems { get; } 
    } 

    public class Entity<T> : IHierachy<T>, IEntity 
    { 
     private int _id; 
     public int Id 
     { 
      get { return _id; } 
      set { _id = value; } 
     } 

     private string _name; 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     public IHierachy<T> _parent; 
     public IHierachy<T> Parent 
     { 
      get 
      { 
       return _parent; 
      } 
     } 

     private List<IHierachy<T>> _childItems; 
     public List<IHierachy<T>> ChildItems 
     { 
      get 
      { 
       if(_childItems == null) 
       { 
        _childItems = new List<IHierachy<T>>(); 
       } 
       return _childItems; 
      } 
     } 

     private List<IHierachy<T>> _linkedItems; 
     public List<IHierachy<T>> LinkedItems 
     { 
      get 
      { 
       if(_linkedItems == null) 
       { 
        _linkedItems = new List<IHierachy<T>>(); 
       } 
       return _linkedItems; 
      } 
     } 
    } 


    public class Item : Entity<Item> 
    { 
    } 

    public class MetaItem : Entity<MetaItem> 
    { 
    } 

    public class Test 
    { 
     public void Test1() 
     { 
      MetaItem meta1 = new MetaItem() { Id = 1, Name = "MetaItem1"}; 
      MetaItem meta2 = new MetaItem() { Id = 1, Name = "MetaItem 1.1"}; 
      Item meta3 = new Item() { Id = 101, Name = "Item 1" }; 

      meta1.ChildItems.Add(meta3); // this line should not compile. 
      meta1.ChildItems.Add(meta2); // This is valid and gets compiled. 
     } 
    } 

} 
+0

Tôi nghĩ rằng anh ấy không muốn cho phép thêm Item làm con của MetaItem (mặc dù mã khôn ngoan, cả hai đều thuộc loại Entity). Trong các từ khác, chỉ MetaItem.ChildItems chỉ nên chứa các MetaItem khác. Tôi không quen thuộc với các công cụ thực thể, do đó, tôi đoán sẽ được thay đổi ChildItem là một danh sách các MetaItems ... – Alan

+0

Ah, có ông đã cố định câu hỏi và bạn là hoàn toàn chính xác. Bạn sẽ cần phải làm cho các thực thể/Hierachies chung chung hơn. Tôi đang sửa giải pháp của tôi ngay bây giờ. –

3

Mã này được biên soạn bởi vì ChildItems sẽ IList<Entity>, trong đó bao gồm cả ItemMetaItem. Nếu bạn đã làm Entity generic:

public class Entity<T> : IHierachy<T>, IEntity where T : IEntity { ... } 

Sau đó, bạn sẽ xác định ItemMetaItem như thế này:

public class Item : Entity<Item> { } 

public class MetaItem : Entity<MetaItem> { } 

Trong trường hợp đó họ ChildItems sẽ là của đúng, hạn chế hơn, loại.

+0

Ok, tôi đã làm việc đó, sau khi thay đổi các tham chiếu đến 'IEntity' bên trong' Entity 'thành' T'. Kế thừa một chuyên môn về bản thân bạn là một kỹ thuật thú vị. –

+0

Vâng, hoàn tất thay đổi 'Entity ' đã được để lại dưới dạng bài tập. :) Chắc chắn là một kỹ thuật hữu ích cho các tình huống cụ thể. – dahlbyk

+0

Hi dahlbyk, Ya. Thêm những thay đổi cần thiết với những thay đổi ở trên hoạt động hoàn hảo của nó. – Raj