C#VS面向对象基础(二)

这里我们接着上一篇博客,继续学习用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>  

      这个学习也是非常基础的,学习设计模式的基础!

原文地址:https://www.cnblogs.com/SJP666/p/4754878.html