定义集合

  前面介绍了使用高级集合类能完成什么任务,下面讨论如何创建自己的强类型化的集合。一种方式是手动实现需要的方法,但这较耗费时间,在某些情况下也非常复杂。我们还可以从一个类中派生自己的集合,例如 System.Collections.CollectionBase 类,这个抽象类提供了集合类的大量实现代码。这是推荐使用的方式。

  CollectionBase 类有接口 IEnumerableICollectionIList,但只提供了一些必要的实现代码,主要是 IListClear()RemoveAt() 方法,以及 ICollectionCount 属性。如果要使用提供的功能,就需要自己实现其他代码。

  为便于完成任务,CollectionBase 提供了两个受保护的属性,它们可以访问存储的对象本身。我们可以使用 ListInnerListList 可以通过 IList 接口访问项,InnerList 则是用于存储项的 ArrayList 对象。

  例如,存储 Animal 对象的集合类可以定义如下(稍后介绍一个较完整的实现代码):

  1. public class Animals : CollectionBase
  2. {
  3. public void Add(Animal newAnimal)
  4. {
  5. List.Add(newAnimal);
  6. }
  7. public void Remove(Animal oldAnimal)
  8. {
  9. List.Remove(oldAnimal);
  10. }
  11. public Animals()
  12. {
  13. }
  14. }

  其中,Add()Remove() 方法实现为强类型化的方法,使用 IList 接口中用于访问项的标准 Add() 方法。这些方法现在只用于处理 Animal 类或派生于 Animal 的类,而前面介绍的 ArrayList 实现代码可处理任何对象。

  CollectionBase 类可以对派生的集合使用 foreach 语法。例如,可使用下面的代码:

  1. Console.WriteLine("Using custom collection class Animals:");
  2. Animals animalCollection = new Animals();
  3. animalCollection.Add(new Cow("Sarah"));
  4. foreach (Animal myAnimal in animalCollection)
  5. {
  6. Console.WriteLine("New {0} object added to custom collection, " +
  7. "Name = {1}", myAnimal.ToString(), myAnimal.Name);
  8. }

  但不能使用下面的代码:

  1. animalCollection[0].Feed();

  要以这种方式通过索引来访问项,就需要使用索引符。