zoukankan      html  css  js  c++  java
  • 9.多态篇

    1.概念

    多态是指多种形态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。例如我在学校是学生,在车上是乘客。在路上是过客。。同一个人不同的身份就是多态。通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态

    2.有趣的多态性代码 new的用法

    代码 
    
    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->public class Animal
        {
            public virtual void Eat()
            {
                Console.WriteLine("Animal eat");
            }
        }
    
        public class Cat : Animal
        {
            public new void Eat()
            {
                Console.WriteLine("Cat eat");
            }
        }
    
        class Tester
        {
            static void Main(string[] args)
            {
                Animal a = new Animal();
                a.Eat();
    
                Animal ac = new Cat();
                ac.Eat();
    
                Cat c = new Cat();
                c.Eat();
            }
        }

    运行结果为:

    Animal eat...

    Animal eat...

    Cat eat....

    可以看出,当派生类Cat的Eat()方法使用new修饰时,Cat的对象转换为Animal对象后,调用的是Animal类中的Eat()方法。其实可以理解为,使用new关键字后,使得Cat中的Eat()方法和Animal中的Eat()方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。所以, Animal类中的Eat()方法不管用还是不用virtual修饰,也不管访问权限如何,或者是没有,都不会对Cat的Eat()方法产生什么影响(只是因为使用了new关键字,如果Cat类没用从Animal类继承Eat()方法,编译器会输出警告)。

    小知识点扩展

    1、重载(overload):在同一个作用域(一般指一个类)的两个或多个方法函数名相同,参数列表不同的方法叫做重载,它们有三个特点(俗称两必须一可以): 

         方法名必须相同  参数列表必须不相同  返回值类型可以不相同

          public void Sleep()         {
                Console.WriteLine("Animal睡觉");         }
            public int Sleep(int time)         {
                Console.WriteLine("Animal{0}点睡觉", time);             return time;         }

    2、重写(override):子类中为满足自己的需要来重复定义某个方法的不同实现,需要用override关键字,被重写的方法必须是虚方法,用的是virtual关键字。它的特点是(三个相同):  相同的方法名  相同的参数列表  相同的返回值。

    父类中的定义:
            public virtual void EatFood()         {
                Console.WriteLine("Animal吃东西");         }  
           子类中的定义:
            public override void EatFood()         {
                Console.WriteLine("Cat吃东西")   //base.EatFood();};

    3、虚方法:即为基类中定义的允许在派生类中重写的方法,使用virtual关键字定义。如:
            public virtual void EatFood()         {
                Console.WriteLine("Animal吃东西");         } 
            注意:虚方法也可以被直接调用。如:
                Animal a = new Animal();             a.EatFood();

     4、抽象方法:在基类中定义的并且必须在派生类中重写的方法,使用abstract关键字定义。

     public abstract class Biology     {
            public abstract void Live();     }
        public class Animal : Biology     {
            public override void Live()         {
                Console.WriteLine("Animal重写的抽象方法");             //throw new NotImplementedException();         } }

    虚方法和抽象方法的区别是:因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现。

    5、隐藏方法:在派生类中定义的和基类中的某个方法同名的方法,使用new关键字定义。如在基类Animal中有一方法Sleep():

    public void Sleep()         {
                Console.WriteLine("Animal Sleep");         }

     则在派生类Cat中定义隐藏方法的代码为:
            new public void Sleep()         {
                Console.WriteLine("Cat Sleep");         } 
                或者为:
            public new void Sleep()         {
                Console.WriteLine("Cat Sleep");         } 

    (1)隐藏方法不但可以隐藏基类中的虚方法,而且也可以隐藏基类中的非虚方法。         

    (2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法。 
    (3)和上一条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果引用的是父类的实例那么调用基类的方法,如果引用的是派生类的实例则调用派生类的方法。

  • 相关阅读:
    Dotnet全平台下APM-Trace探索
    既生瑜何生亮?ASP.NET MVC VS ASP.NET Web API
    Dapper.NET——轻量ORM
    什么?字符串为空?
    Vue模板语法
    邂逅Vue.js
    Zookeeper是什么&怎么用
    虚拟机间实现免密登录
    十大排序算法最详细讲解
    JS将数字格式化成金融数字样式(千位分隔符,三位一个逗号间隔)
  • 原文地址:https://www.cnblogs.com/cygnet/p/4170511.html
Copyright © 2011-2022 走看看