定义集合
前面介绍了使用高级集合类能完成什么任务,下面讨论如何创建自己的强类型化的集合。一种方式是手动实现需要的方法,但这较耗费时间,在某些情况下也非常复杂。我们还可以从一个类中派生自己的集合,例如 System.Collections.CollectionBase
类,这个抽象类提供了集合类的大量实现代码。这是推荐使用的方式。
CollectionBase
类有接口 IEnumerable
、ICollection
和 IList
,但只提供了一些必要的实现代码,主要是 IList
的 Clear()
和 RemoveAt()
方法,以及 ICollection
的 Count
属性。如果要使用提供的功能,就需要自己实现其他代码。
为便于完成任务,CollectionBase
提供了两个受保护的属性,它们可以访问存储的对象本身。我们可以使用 List
和 InnerList
,List
可以通过 IList
接口访问项,InnerList
则是用于存储项的 ArrayList
对象。
例如,存储 Animal
对象的集合类可以定义如下(稍后介绍一个较完整的实现代码):
public class Animals : CollectionBase
{
public void Add(Animal newAnimal)
{
List.Add(newAnimal);
}
public void Remove(Animal oldAnimal)
{
List.Remove(oldAnimal);
}
public Animals()
{
}
}
其中,Add()
和 Remove()
方法实现为强类型化的方法,使用 IList
接口中用于访问项的标准 Add()
方法。这些方法现在只用于处理 Animal
类或派生于 Animal
的类,而前面介绍的 ArrayList
实现代码可处理任何对象。
CollectionBase
类可以对派生的集合使用 foreach
语法。例如,可使用下面的代码:
Console.WriteLine("Using custom collection class Animals:");
Animals animalCollection = new Animals();
animalCollection.Add(new Cow("Sarah"));
foreach (Animal myAnimal in animalCollection)
{
Console.WriteLine("New {0} object added to custom collection, " +
"Name = {1}", myAnimal.ToString(), myAnimal.Name);
}
但不能使用下面的代码:
animalCollection[0].Feed();
要以这种方式通过索引来访问项,就需要使用索引符。