体验多态之美(转)

      早在看《大话设计模式》第一章的时候,就对诸如Animal = New Cat ()这种用父类来引用之类的多态用法就不是很懂了,当初习惯的思维是Animal就一定要实例化一个Animal类,对于接口也同样!
      现在写到《大话设计模式》后面面向对象基础的时候,才算是把这个问题搞懂了。
      看来,要学好C#,首先应该打好面向对象的基础。上面说到的“面向对象基础”就是一个很好的入门!

      不多说了,先看看多态的例子吧:
下面是Animal类:

      用到多态的时候,要注意:子类以父类的身份出现;在工作时候以自己的方式实现;子类以父类的身份出现时候,子类特有的方法和属性不可以使用。
     同时,为了使子类的实例完全接替来自父类的类成员,父类应该将该成员声明为虚拟。而子类通过Virtual关键字来实现父类的虚拟方法。

     本文的大部分内容均来自《大话设计模式》,谢谢程老师提供了这么好的学习资料!


using System;
using System.Collections.Generic;
using System.Text;

namespace 面向对象基础
{
    
public class Animal
    
{
        
protected string name = "";
        
public Animal(string name)
        
{
            
this.name = name;
        }

        
public Animal()
        
{
            
this.name = "无名";
        }

        
protected  int shoutNum = 3;
        
public  int ShoutNum
        
{
            
get return shoutNum; }
            
set { shoutNum = value; }
        }

        
//添加虚方法,可以被子类重写
        public virtual string Shout()
        
{
            
return "";
        }

    }


    
public class Cat :Animal 
    
{
        
public Cat()
            : 
base()
        
{ }
        
public Cat(string name)
            : 
base(name)
        
{ }
        
//重写虚方法
        public override string  Shout()
        
{
            
string result = "";
            
for (int i = 0; i < shoutNum; i++)
            
{
                result 
+= "";
            }

            
return "我的名字叫" + name + " "+result;
        }

    }

    
public class Dog : Animal
    
{
        
public Dog()
            : 
base()
        
{ }
        
public Dog(string name)
            : 
base(name)
        
{ }
        
//重写虚方法
        public override string Shout()
        
{
            
string result = "";
            
for (int i = 0; i < shoutNum; i++)
            
{
                result 
+="";
            }

            
return "我的名字叫" + name + " " + result;
        }

    }


}

 

客户代码:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace 面向对象基础
{
    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
        }


        
        
private void button1_Click(object sender, EventArgs e)
        
{
            Cat cat 
= new Cat("咪咪");
            cat.ShoutNum 
= 5;
            MessageBox.Show(cat.Shout());
        }


        
private void button2_Click(object sender, EventArgs e)
        
{
            Dog dog 
= new Dog("豆豆");
            dog.ShoutNum 
= 5;
            MessageBox.Show(dog.Shout());
        }


        
private Animal[] arraryAnimal;      //  声明一个动物数组
        
//动物报名
        private void button3_Click(object sender, EventArgs e)
        
{
            arraryAnimal 
= new Animal[5];   //实例化最多可以5个动物参赛
            arraryAnimal[0= new Cat("小花");
            arraryAnimal[
1= new Cat("阿猫");
            arraryAnimal[
2= new Dog("阿旺");
            arraryAnimal[
3= new Dog("小强");
            arraryAnimal[
4= new Dog("旺才");

        }


        
//动物叫声比赛
        private void button4_Click(object sender, EventArgs e)
        
{
            
foreach (Animal aniItem in arraryAnimal)    //历遍数组
            {
                
//  由于多了多态,所以在叫声的时候,程序会自动找aniItem是什么对象,然后重写这个方法
                MessageBox.Show(aniItem.Shout());
            }

        }

    }

}

 

客户窗体:


     Cat和Dog都继承自Animal,但是它们的叫声均不相同,这就是所谓的“不同对象执行相同的动作,但要通过子类自己的代码来实现”。
     在使用多态的时候要注意,对象的声明必须是父类,而不是子类,实例化对象是子类,这才实现多态。多态的原理相当于当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现被调用。也就是说,虚方法是按照其运行时而不是编译时类型进行动态绑定调用的。
   

     多态是面向对象的三大特征之一。它表示不同的对象可以执行相同的动作,但是要通过自己的代码实现。

 

posted @ 2008-10-21 08:53  威尼斯的夏天  阅读(129)  评论(0编辑  收藏  举报