这里我们接着上一篇博客,继续学习用C#实现面向对象中的概念。这里学习下边几个,当然我们还是通过动物比赛的例子。
多态:表示不同的对象可以执行相同的动作,但是通过它们自己的实现代码来执行。这里需要将父类将该成员声明为虚拟的,而且用到了方法重写(override).
抽象类:用abstract声明抽象类,注意抽象类不能实例化,抽象方法必须被子类重写。
接口:是把隐式公共方法和属性组合起来,以封装特定的功能的一个集合,一旦类实现了接口,就可以支持接口所指定的所有属性好成员。一个类可以支持多个接口,多个类也可以支持相同的接口。
集合:是优于数组,.NET Framework提供了用于数据存储和检索的专用类。集合随着我们向里边添加元素而自动增加,自动调节大小。提供了对堆栈,队列和哈希表的支持。
泛型:具有占位符(即参数类型)的类,结构,接口和方法。和集合紧密联系,泛型集合可以获得类型安全的直接优点。也就是说类型固定了。
下边我们通过这个例子来理解上边的概念:
定义类和接口的代码:
1 [csharp] view plaincopyprint? 2 <span style="font-size:18px;"> abstract class Animal//利用关键字abstract定义了一个抽象类 3 { 4 protected string name = ""; 5 public Animal(string name) 6 { 7 this.name = name; 8 } 9 public Animal() 10 { 11 this.name = "无名"; 12 } 13 14 protected int shoutNum = 6;//叫声的次数 15 public int ShoutNum 16 { 17 get 18 { 19 return shoutNum; 20 } 21 set 22 { 23 shoutNum = value; 24 } 25 } 26 27 28 public string shout()//叫声发出的代码 29 { 30 string result = ""; 31 for (int i = 0; i < shoutNum; i++) 32 result += getshoutsound() + ", ";//调用了getshoutsound的虚方法 33 return "我的名字叫"+ name + ""+result ; 34 35 } 36 protected virtual string getshoutsound()//修饰符virtual表示此方法为虚方法,可以被子类重写 37 { 38 return ""; 39 } 40 } 41 42 43 //定义不同的子类,来实现父类,其实就是多态的很好体现 44 class Cat:Animal //子类猫 45 { 46 public Cat():base() 47 {} 48 public Cat (string name):base (name) 49 {} 50 protected override string getshoutsound() 51 { 52 return"喵"; 53 } 54 } 55 56 57 class Dog : Animal//子类狗 58 { 59 public Dog() 60 : base() 61 { } 62 public Dog(string name) 63 : base(name) 64 { } 65 protected override string getshoutsound() 66 { 67 return "喵"; 68 } 69 } 70 71 72 class Cattle : Animal//子类牛 73 { 74 public Cattle() 75 : base() 76 { } 77 public Cattle(string name) 78 : base(name) 79 { } 80 protected override string getshoutsound() 81 { 82 return "哞"; 83 } 84 } 85 86 87 class sheep:Animal//子类羊 88 { 89 public sheep ():base() 90 {} 91 public sheep(string name) 92 : base(name) 93 { } 94 protected override string getshoutsound() 95 { 96 return "咩"; 97 } 98 } 99 100 101 interface Ichange//定义了一个接口 102 { 103 string changething(string thing); 104 } 105 106 107 class Machinecat : Cat, Ichange//定义了个机器猫,继承父类猫,并使用了接口Ichange 108 { 109 public Machinecat() 110 : base() 111 { } 112 public Machinecat(string name) 113 : base(name) 114 { } 115 public string changething(string thing) 116 { 117 return base.shout ()+ "我有万能口袋,我可以变出:" + thing; 118 } 119 }</span>
下边是客户端的代码:
[csharp] view plaincopyprint? <span style="font-size:18px;"> //private Animal[] arrayAnimal;//声明一个动物数组 //集合的使用 IList<Animal> arrayAnimal;//声明一个泛型集合变量,用接口Ilist,注意Ilist<Animal>表示此集合变量只能接受Animal类型 //猫叫的按钮事件 private void button1_Click(object sender, EventArgs e) { Cat cat = new Cat("咪咪"); //类的实例化 cat.ShoutNum = 7; MessageBox.Show(cat.shout()); } //狗叫的按钮事件 private void button2_Click(object sender, EventArgs e) { Dog dog = new Dog("旺财");//这里只是简单的调用方法,即可实现目的,体现了封装的特性 dog.ShoutNum = 6; MessageBox.Show(dog.shout()); } //动物报名的按钮 private void button3_Click(object sender, EventArgs e)//动物报名按钮, { //arrayAnimal = new Animal[5];//实例化最多可以可报名5个的动物数组对象 arrayAnimal = new List<Animal> ();//实例化List对象 arrayAnimal.Add(new Cat ("小花"));//报名分别是猫和狗 arrayAnimal.Add( new Dog("阿毛")); arrayAnimal.Add ( new Dog("小黑")); arrayAnimal.Add(new Cat("娇娇")); arrayAnimal.Add( new Cat("咪咪")); MessageBox.Show(arrayAnimal.Count.ToString());//打印出我们添加的个数 arrayAnimal.RemoveAt(1);//这里还可以删除我们多添加的。 } //让报名的所有动物进行叫声比赛 private void button4_Click(object sender, EventArgs e) { foreach (Animal item in arrayAnimal)//遍历整个数组,让他们一次实施shout的方法 { MessageBox.Show(item.shout()); } } //叮当猫变出东西的事件代码 private void button5_Click(object sender, EventArgs e) { Machinecat mcat = new Machinecat("叮当");//实例化机器猫 Machinecat mcat1 = new Machinecat("叮当2"); Ichange[] array = new Ichange[2];//声明一个接口数组,将两个实例赋值给数组 array[0] = mcat; array [1]=mcat1; MessageBox.Show(array[0].changething("各种各样的东西!"));//利用多态性,实现不同的changething MessageBox .Show (array[1].changething ("好多好多东西哈!")); }</span>
这个学习也是非常基础的,学习设计模式的基础!