2011-01-14 17 views
6

Về cơ bản giả sử bạn có một số bộ sưu tập:Bạn có muốn trả lại IEnumerator <T> .GetEnumerator() trong IEnumerator.GetEnumerator()?

public class FurCollection : IEnumerable<FurStrand> 
{ 
    public IEnumerator<FurStrand> GetEnumerator() 
    { 
     foreach(var strand in this.Strands) 
     { 
     yield return strand; 
     } 
    } 

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

Điều này có được chấp nhận không? Hoặc là thực hành dễ bị lỗi hoặc xấu này? Tôi sẽ luôn sử dụng số IEnumerator<T> nhưng tôi vẫn muốn phiên bản không phải là phiên bản chung được ổn định và được triển khai đúng cách.

+0

Tôi chắc chắn bạn có nghĩa là ** IEnumerable ** thay vì sau đó ** IEnumerator ** ... –

+0

Cảm ơn bạn đã viết mẫu này một cách nhanh chóng. –

Trả lời

10

Đây là tiêu chuẩn hoàn toàn và được khuyến nghị tuân thủ DRY và các mối quan ngại khác.

Lưu ý rằng

return strand; 

nên

yield return strand; 

Bên cạnh đó, có vẻ như this.Strands đã thực hiện IEnumerable<FurStrand> vì vậy bạn chỉ có thể nói

return this.Strands.GetEnumerator(); 
+1

Tôi đồng ý, thực hành tốt –

+0

Cảm ơn người đàn ông, xin lỗi tôi vừa tạo mẫu này lên, vì vậy, quên sản lượng. –

+0

@Downvoter: Bạn thực sự cần phải giải thích cho mình. – jason

5

Không, điều này hoàn toàn có thể chấp nhận được. Được đề xuất ngay cả.

4

Không chỉ là thực hành tốt này, nhưng dự án của bạn sẽ không phàn nàn nếu không có nó, bởi vì IEnumerable<T> kế thừa IEnumerable. Nhìn vào định nghĩa của IEnumerable<T>:

public interface IEnumerable<out T> : IEnumerable 
    IEnumerator<T> GetEnumerator(); 
} 

Bạn cần phải triển khai phiên bản không chung chung hoặc bạn sẽ nhận được một lỗi "... không thực hiện thành viên giao diện ..."

+0

Bạn hiểu nhầm câu hỏi. – jason

+0

Ồ, giải pháp thay thế là gì? –

+0

Nevermind Tôi nhận được nó. Tôi nghĩ rằng tôi đã học cách làm theo cách đó với Generics, không bao giờ xảy ra với tôi để không trả lại cùng một điều tra viên. –

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