专注

导航

面向对象基础-多态

还是动物的例子,如果我们现在要举办一个动物运动会,来参加的有各种各样的动物,其中有个项目是“叫声比赛”。界面上放放两个按钮,一个是“动物报名”,就是确定动物的种类和报名的顺序,一个就是“叫声比赛”,就是报名的动物挨个交出声音来比赛。注意来报名的各种动物,我们不知道,可能是猫,狗.......如何实现?
如果按照
多态的含义:表示不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。
为了使子类的实例化完全接替来自父类的类成员,父类必须将该成员声明为虚拟的,这是通过在该成员的返回类型之前添加virtual关键字来实现。
子类可以通过override关键字,将父类实现替代为他自己的实现,这就是方法重写Override,或者叫做方法覆写。

    class Animal 
    { 
        ............................         
        public virtual string Shout() 
        { 
            return ""; 
        } 
    } 
这个时候,Cat和Dog的类就变成这样子了 
    class Cat : Animal 
    { 
        .................... 
        public override string Shout() 
        { 
            string result = ""; 
            for (int i = 0; i <= shoutNum; i++) 
            { 
                result += "喵 "; 
            } 
            return "我的名字叫" + name + "," + result; 
        } 
} 
所以,可以通过下面代码实现报名和比赛的功能; 
       private Animal[] arrayAniaml; 
        private void button2_Click(object sender, EventArgs e) 
        { 
            arrayAniaml = new Animal[5]; 
            arrayAniaml[0] = new Cat("mao1"); 
            arrayAniaml[1] = new Dog("gou1"); 
            arrayAniaml[2] = new Cat("mao2"); 
            arrayAniaml[3] = new Cat("mao3"); 
            arrayAniaml[4] = new Dog("gou2"); 
        } 
        private void button3_Click(object sender, EventArgs e) 
        { 
            foreach (Animal item in arrayAniaml) 
            { 
                MessageBox.Show(item.Shout()); 
            } 
        } 

举一个现实生活中的实例说明多态。
我国的国粹“京剧”,以前都是子承父业,代代相承的艺术,假如有这样一对父子,父亲是非常有名的京剧艺术家,儿子长大成人,模仿父亲的戏也惟妙惟肖。有一天,父亲突然发高烧,上不了台,但是演出的票都已经卖出,退票显然不行,怎么办了?由于京剧演员都是化妆上台演出,于是决定让儿子顶替父亲上台出演。化妆以后只要长得好就可以糊楞过去了。
(1)子类以父类的身份出现:儿子代替老子演出,化妆后就是以父亲身份出现。
(2)子类在工作时以自己的方式来实现:儿子模仿再好,也是模范,儿子只能用自己理解的表现形式模范父亲的作品。
(3)子类以父类的身份出现时:子类特有的属性和方法不能使用:儿子经过过年的学习,其实已经有了自己的创作,自己的绝活,但是此时不能够用,因为是代替父亲表演。当然父亲也有别的儿子会表演,也可以代表父亲上场,道理一样。
这就是多态。
上面的动物的例子,Animal代表的父亲,Cat和Dog代表相当于儿子,儿子代表父亲表演Shout,但是Cat叫出来的“喵”,Dog叫出来的是“旺”,这就是所谓不同的对象可以执行相同的动作,但是要通过他们自己的实现代码来执行。
还要注意的是:这个对象声明必须是父类,而不是子类,实例化的对象是子类,这才是多态。
多态的原理是当方法被调用时,无论对象时候被转换成父类,都只有位于对象继承链最末端的方法实现被调用。也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。

posted on 2011-11-13 12:25  陈啊M  阅读(236)  评论(0编辑  收藏  举报