定义集合
  前面介绍了使用高级集合类能完成什么任务,下面讨论如何创建自己的强类型化的集合。一种方式是手动实现需要的方法,但这较耗费时间,在某些情况下也非常复杂。我们还可以从一个类中派生自己的集合,例如 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();
要以这种方式通过索引来访问项,就需要使用索引符。
🔚