2009-12-12 16 views
9

Tôi có một lớp học, mà chỉ là một wrapper qua một danh sách, ví dụ,Thực hiện IEnumerable <T> Đối với một danh sách Wrapper

public class Wrapper 
{ 
    public List<int> TList 
    {get;set;} 
    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 

Tôi muốn làm Wrapper thừa hưởng từ IEnumerable vì vậy mà tôi có thể sử dụng cú pháp sau:

Wrapper wrapper = new Wrapper() 
         { 
         2,4,3,6 
         }; 

Bất kỳ ý tưởng làm thế nào để mà giao diện để thực hiện IEnumerable<T>, hoặc IEnumerable, và làm thế nào để xác định cơ thể phương pháp?

+0

Không, với IEnumerable nó sẽ không hoạt động. Tôi nghĩ rằng bạn phải thực hiện ICollection . – deerchao

+3

Không, deerchao, nó cần IEnumerable . Chúng tôi không * yêu cầu * ICollection , mặc dù tất nhiên, nó là hợp lý để làm như vậy. –

Trả lời

32

Nếu bạn triển khai ICollection<int> bạn nhận được chức năng mong muốn.

Correction: bạn thực sự chỉ cần phải thực hiện IEnumerable hoặc IEnumerable<T> và có một Add phương pháp nào trong lớp học của bạn:

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    { get; private set; } 
    public Wrapper() 
    { 
     TList = new List<int>(); 
    } 

    public void Add(int item) 
    { 
     TList.Add(item); 
    } 
    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

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

(Tôi cũng mất sự tự do làm những TList setter tư nhân; nó thường được khuyến cáo rằng thuộc tính loại bộ sưu tập là chỉ đọc để bộ sưu tập không thể thay thế bằng bất kỳ mã nào bên ngoài loại.)

+0

Damnit, bạn đánh tôi với nó :) – ICR

+0

Tại sao chúng ta cần phải thực hiện cả một phiên bản chung và không chung chung của GetEnumerator? – hdgarrood

+0

@hdgarrood Điều này là cần thiết bởi vì 'IEnumerable 'kế thừa' IEnumerable' mà không phải là chung chung. Một kiểu thực hiện 'IEnumerable ' cũng thực hiện 'IEnumerable', vì vậy các phương thức đó cũng cần phải có mặt. –

9

Để nhận bộ khởi tạo bộ sưu tập, bạn cần phải làm 2 việc:

  1. Thực hiện IEnumerable
  2. Có một phương pháp gọi là Add với chữ ký đúng

Cách thích hợp hơn để có được những là thực hiện ICollection, nhưng tối thiểu bạn cần phải làm là:

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    {get;set;} 

    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() // Explicitly implement the non-generic version. 
    { 
     return TList.GetEnumerator(); 
    } 

    public void Add(int i) 
    { 
     TList.Add(i); 
    } 

    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 
Các vấn đề liên quan