views:

1000

answers:

5

ArrayList declare that it implements IList, ICollection, IEnumeralbe interfaces. Why not only implement IList, because IList is also derived from ICollection, ICollection is derived from IEnumerable.

What's the purpose of this kind of declare? there are many cases like this in .net BCL.

A: 
  1. IEnumerable - To support the foreach statement
  2. ICollection - To support add single or multiple item in arraylist
Sarathi1904
questioner was not asking what they were for - was asking why they are explicitly listed as being implemented, when they are already implemented by virtue of inheritance on IList
Rob Levine
+10  A: 

There is no effective difference. I believe the extra declarations are there for clarity.

When checked in Reflector, classes which in code implement IList have the same interface declaration list as classes which in code declare implementing all of Ilist, ICollection and IEnumerable.

kek444
+4  A: 

With the following code:

interface I1 { }
interface I2 : I1 { }

class Foo: I2 { }

If you look at Foo through reflection you will find

class Foo: I2, I1 { }

Which is also valid to compile and gives the same result.
So the difference is moot, and in documenting Foo you might as well write it with both interfaces.

Also see the SO question: Why collections classes in C# (like ArrayList) inherit from multiple interfaces if one of these interfaces inherits from the remaining?

Henk Holterman
+1  A: 

I am not so sure that ArrayList has separate implementations of the interfaces. Consider the following code:

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; }
}

The MyClass type implements only the ISub interface directly. However, if you compile the code into an assembly, and then add that assembly as reference in another project, open the Object Browser and examine the base types for MyClass, it will feature something like this:

Base Types
 |- ISub
 |    |- IBase
 |- IBase
 |- Object
Fredrik Mörk
A: 

Sorry, i was not understanding this