定义集合

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

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

  为便于完成任务,CollectionBase 提供了两个受保护的属性,它们可以访问存储的对象本身。我们可以使用 ListInnerListList 可以通过 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();

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

🔚