2009-07-22 27 views
15

ArrayList tuyên bố rằng nó triển khai các giao diện IList, ICollectionIEnumeralbe.Tại sao ArrayList thực hiện IList, ICollection, IEnumerable?

Tại sao không chỉ thực hiện IList, vì IList cũng có nguồn gốc từ ICollection, và ICollection có nguồn gốc từ IEnumerable.

Mục đích của loại khai báo này là gì? Có rất nhiều trường hợp như thế này trong .NET BCL.

Trả lời

7

Với đoạn mã sau:

interface I1 { } 
interface I2 : I1 { } 

class Foo: I2 { } 

Nếu bạn nhìn vào Foo thông qua phản ánh bạn sẽ tìm thấy

class Foo: I2, I1 { } 

nào cũng có giá trị để biên dịch và đưa ra kết quả tương tự.
Vì vậy, sự khác biệt là tranh luận, và trong tài liệu Foo bạn cũng có thể viết nó với cả hai giao diện.

Cũng xem các câu hỏi SO: Why collections classes in C# (like ArrayList) inherit from multiple interfaces if one of these interfaces inherits from the remaining?

-1
  1. IEnumerable - Để hỗ trợ cho tuyên bố foreach
  2. ICollection - Để hỗ trợ thêm một hoặc nhiều mục trong ArrayList
+0

hỏi không hỏi họ đang làm gì - đã hỏi tại sao họ được liệt kê rõ ràng là đang được thực hiện, khi họ đã được thực hiện bởi đức hạnh thừa kế trên IList –

13

Không có sự khác biệt có hiệu quả. Tôi tin rằng những tuyên bố bổ sung ở đó là rõ ràng.

Khi được chọn trong Trình phản xạ, các lớp thực thi mã IList có cùng danh sách khai báo giao diện như các lớp trong mã khai báo triển khai tất cả Ilist, ICollectionIEnumerable.

1

tôi không như vậy chắc chắn rằng ArrayList có triển khai riêng biệt của các giao diện. Hãy xem xét mã sau:

public interface IBase 
{ 
    int SomeInt { get; set; } 
} 

public interface ISub : IBase 
{ 
    int SomeOther { get; set; } 
} 

public class MyClass : ISub 
{ 
    public int SomeOther { get; set; } 
    public int SomeInt { get; set; } 
} 

Loại MyClass chỉ thực hiện giao diện ISub trực tiếp. Tuy nhiên, nếu bạn biên dịch mã vào một assembly, và sau đó thêm lắp ráp mà như tài liệu tham khảo trong một dự án khác, mở Object Browser và kiểm tra các loại cơ sở cho MyClass, nó sẽ có một cái gì đó như thế này:

Base Types 
|- ISub 
| |- IBase 
|- IBase 
|- Object 
Các vấn đề liên quan