2009-07-24 49 views
8

Tôi mới sử dụng Generics. Tôi muốn triển khai bộ sưu tập của riêng mình bằng cách lấy nó từ giao diện IList<T>.Thực hiện giao diện IList

Bạn có thể vui lòng cung cấp cho tôi một số liên kết đến lớp học triển khai giao diện IList<T> hoặc cung cấp cho tôi mã ít nhất là thực hiện các phương thức AddRemove?

Trả lời

14

Trừ khi bạn có một lý do rất thuyết phục để làm như vậy, đặt cược tốt nhất của bạn sẽ được kế thừa từ System.Collections.ObjectModel.Collection<T> vì nó có mọi thứ bạn cần. Vui lòng lưu ý rằng mặc dù những người triển khai IList<T> không bắt buộc phải thực hiện this[int] (người lập chỉ mục) là O (1) (về cơ bản, truy cập liên tục), bạn nên thực hiện điều đó một cách mạnh mẽ.

2

Bạn có thể xem Mono project. Có sẵn mã nguồn hoàn chỉnh, sou bạn có thể xem một số lớp được triển khai như thế nào. Ví dụ: "System.Collections.Generics.List < T>".

+2

http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Collections.Generic/List.cs?view=markup – Stobor

+0

sau khi mở trang chủ của dự án Mono .. what Tôi có nên tải xuống không ?? –

+0

Cập nhật liên kết đến lớp Mono - https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/List.cs –

1

Trong hầu hết các trường hợp, bạn chỉ cần sử dụng List<T> hoặc lấy được từ List<T>. Nếu bạn lấy được từ List<T>, bạn sẽ tự động nhận được triển khai cho Thêm và Xóa.

24

Ngoài việc xuất phát từ List<T>, bạn có thể sử dụng mặt tiền List<T> và thêm nhiều tính năng hơn vào lớp mặt tiền của bạn.

class MyCollection<T> : IList<T> 
{ 
    private readonly IList<T> _list = new List<T>(); 

    #region Implementation of IEnumerable 

    public IEnumerator<T> GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    #endregion 

    #region Implementation of ICollection<T> 

    public void Add(T item) 
    { 
     _list.Add(item); 
    } 

    public void Clear() 
    { 
     _list.Clear(); 
    } 

    public bool Contains(T item) 
    { 
     return _list.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     _list.CopyTo(array, arrayIndex); 
    } 

    public bool Remove(T item) 
    { 
     return _list.Remove(item); 
    } 

    public int Count 
    { 
     get { return _list.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return _list.IsReadOnly; } 
    } 

    #endregion 

    #region Implementation of IList<T> 

    public int IndexOf(T item) 
    { 
     return _list.IndexOf(item); 
    } 

    public void Insert(int index, T item) 
    { 
     _list.Insert(index, item); 
    } 

    public void RemoveAt(int index) 
    { 
     _list.RemoveAt(index); 
    } 

    public T this[int index] 
    { 
     get { return _list[index]; } 
     set { _list[index] = value; } 
    } 

    #endregion 

    #region Your Added Stuff 

    // Add new features to your collection. 

    #endregion 
} 
+0

Nhưng trong trường hợp này tôi không thể ràng buộc bộ sưu tập của mình để DataGridView thay vì tôi phải vạch trần thành viên _list trong MyCollection. –

+0

Những hạn chế của việc này là gì? –

+2

Xin lỗi vì trả lời trễ, nhưng điều này đã làm mất tôi @ 'IEnumerator GetEnumerator' trở về' GetEnumerator'. Điều này trông giống như một tham chiếu vòng tròn. Làm thế nào điều này không gây ra một ngoại lệ tràn ngăn xếp? – jp2code

0

Thừa hưởng từ Danh sách thường là cách tiếp cận nhanh nhất nhưng có thể được hạn chế sau này xuống dòng nếu bạn cần phải kế thừa từ một lớp khác (ví dụ ContextBoundObject vv). Việc thực hiện IList khá nhanh và như đã chỉ ra ở trên, nó mang lại sự linh hoạt hơn rất nhiều.

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