高级码农
命运在自己手里
Animal.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace ConsoleApplication1
 6{
 7   public abstract  class Animal
 8    {
 9        protected string name;
10
11        public string Name
12        {
13            get { return name; }
14            set { name = value; }
15        }

16       public Animal()
17       {
18           name = "The animal with no name!";
19       }

20       public Animal(string newName)
21       {
22           name = newName;
23       }

24       public void Feed()
25       {
26           Console.WriteLine("{0}has been Fed",name);
27       }

28    }

29    public class Cow : Animal
30    {
31        public void Milk()
32        {
33            Console.WriteLine("{0}has been milked",name);
34        }

35        public Cow(string newName)
36            : base(newName)
37        { 
38
39        }

40    }

41    public class Chicken : Animal
42    {
43        public void LayEgg()
44        {
45            Console.WriteLine("{0}has laid an egg",name);
46        }

47        public Chicken(string newName)
48            : base(newName)
49        { 
50        }

51    }

52
53}

54
program.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Collections;
 5
 6namespace ConsoleApplication1
 7{
 8    class Program
 9    {
10        static void Main(string[] args)
11        {
12            Console.WriteLine("create an array type collection of animal "+"object and use it");
13            Animal[] animalArray= new Animal[2];
14            Cow mycow1 = new Cow("Ddirde");
15            animalArray[0] = mycow1;
16            animalArray[1] = new Chicken("ken");
17            foreach (Animal myAnimal in animalArray)
18            {
19                Console.WriteLine("New{0}object added to Array collecton "+"NAME={1}",myAnimal.ToString(),myAnimal.Name);
20            }

21            Console.WriteLine("Array collection contains {0} object",animalArray.Length);
22            animalArray[0].Feed();
23            ((Chicken)animalArray[1]).LayEgg();
24            Console.WriteLine();
25
26            Console.WriteLine("Create an arraylist type collection of Animal  "+"object in use it!");
27            ArrayList animalArrarylist = new ArrayList();
28            Cow mycow2 = new Cow("Hayley");
29            animalArrarylist.Add(mycow2);
30            animalArrarylist.Add(new Chicken("roy"));
31
32            foreach (Animal myanimal in animalArrarylist)
33            {
34                Console.WriteLine("new {0} object added to Arraylist collection ,"+"Name ={1}",myanimal.ToString(),myanimal.Name);
35            }

36            Console.WriteLine("arraylist contains {0} objects",animalArrarylist.Count);
37            ((Animal)animalArrarylist[0]).Feed();
38            ((Chicken)animalArrarylist[1]).LayEgg();
39            Console.WriteLine();
40
41            Console.WriteLine("additional manipulation of animallist: ");
42            animalArrarylist.RemoveAt(0);
43            ((Animal)animalArrarylist[0]).Feed();
44            animalArrarylist.AddRange(animalArray);
45            ((Chicken)animalArrarylist[2]).LayEgg();
46            Console.WriteLine("the animal called {0} is at index {1}",mycow1.Name,animalArrarylist.IndexOf(mycow1));
47            mycow1.Name = "jane";
48            Console.WriteLine("the animal is now  called {0} ",((Animal)animalArrarylist[1]).Name);
49        }

50    }

51}

这个范例创建了两个对象集合,第一个集合使用System.Arrat类(着是一个简单的数组),第二个集合使用System.Arraylist类。这两个集合都是Animal对象,在Animal.cs中被定义。Animal类是抽象类,所以不能进行实例化。但通过多态性,可以使集合的项目成为派生于Animal类的cow和chicken的实例。
这些数组在program.cs的main()方法中创建好后,就可以显示其特性和功能。有几个处理操作可以应用到array和arraylist集合上,但是他们的语法略有区别,但是也有一些操作使用更高级的arraylist类型。
下面首先通过比较这两种集合的代码和结果,讨论一下这两种集合类似的操作。
首先集合的创建--对于简单的数组来说,必须用固定的大小来初始化数组,这样才能使用它。使用标准语法创建数组animalarray:
Animal[] animalArray= new Animal[2];

另一方面,arraylist集合不需要初始化其大小,所以可以使用下面的代码创建列表animalArrayList:

 

ArrayList animalArrarylist = new ArrayList();

 

这个类还有另外两个构造函数可以使用,第一个构造函数把现有的集合作为参数,把现有的集合的内容复

制到新的实例中;而另外一个构造函数也通过一个参数设置集合的容量(capacity)。这个容量使用一个

int值指定,设置集合中可以包含的项目数。但是这并不是真实的容量,因为如果集合的项目个数超过了

这个值,容量就会自动增大一倍。

因为数组是引用类型的数组(例如Animal和Animal派生的对象),所以用一个长度初始化数组并没有初始

化他所包含的项目。要使用一个指定的项目还,该项目还需要初始化,即需要给这个项目赋初始化了的对

象:

 

1Cow mycow1 = new Cow("Ddirde");
2
3 animalArray[0] = mycow1;
4
5 animalArray[1] = new Chicken("ken");
6
7

这段代码以两种方式完成了该初始化任务:用现有的cow对象来赋值,或者通过创建新的chicken对象来赋值。主要区别是前者引用了数组的对象—我们在代码的后面使用了这种方式。

对于arraylist集合,它没有现成的项目,也没有null引用的项目。这样就不能以相同的方式给索引赋一些新实例。我们使用arraylist对象的add()方法添加新项目:

1Cow mycow2 = new Cow("Hayley");
2
3            animalArrarylist.Add(mycow2);
4
5            animalArrarylist.Add(new Chicken("roy"));
6
7

除了语法略有不同外,还可以用相同的方式把新对象或现有的对象添加到集合中。以这种方式添加完项目后,就可以使用与数组相同的语法来重写它们,例如:

animalArrayList[0]=new Cow(“Alma”);

但不能在这个范例中这么做。

集合—无论是简单的数组,还是比较复杂的集合都用的不多,除非它们可以访问属于她们的项目。简单数组是强类型化的,可以之间访问它们所包含的项目类型。所以可以直接调用项目的方法:

animalArray[0].Feed();

数组的类型是抽象类型Animal,因此不能直接调用由派生类提供的方法。而必须使用数据类型转换:

((Chicken)animalArray[1]).LayEgg();

ArrayList集合是System.Object对象的集合(通过多态性赋给Animal对象),所以必须对所有的项目进行数据类型转换:

1animalArrarylist.RemoveAt(0);
2
3           (Animal)animalArrarylist[0]).Feed();
4
5            ((Chicken)animalArrarylist[1]).LayEgg();
6
7

 


待续!!!
 
posted on 2006-04-20 13:24  高级码农  阅读(1413)  评论(0)    收藏  举报

我的照片