ArrayList
declares that it implements the IList
, ICollection
, and IEnumeralbe
interfaces.
Why not only implement
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
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
.
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?