zoukankan      html  css  js  c++  java
  • C#的多态性

    参考网址:http://www.cnblogs.com/zhangkai2237/archive/2012/12/20/2826734.html

    多态的定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

    在理解多态之前了解几个概念:重载,重写,虚方法,抽象方法以及隐藏方法。

    1、重载:在同一个作用域(一般指一个类)两个或多个方法函数名相同,参数列表不同的方法叫做重载,他们有三个特点

      (1)方法名必须相同

     (2)参数列表必须不相同

      (3)返回值类型可以不相同

    public void Sleep(){
      cw("Animal睡觉");  
    }
    public int sleep(){
      cw("Animal几点睡觉");
    }
    public void Sleep(int time)
    {
        cw("Animal{0}点睡觉",time);
    } 

    2、重写:子类中满足自己的需要来重复定义某个方法的不同实现,需要用override关键字,被重写的方法必须是虚方法,用的是virtual关键字。

      (1)相同的方法名。

      (2)相同的参数列表。

      (3)相同的返回值。

    父类中的定义:
      public virtual void EatFood()
     {
        cw("Animal吃东西")  ;
     }
     
     子类中的定义
     public override void EatFood(){
        cw("cat吃东西"); 
    } 
      

     tips:虚方法能直接被调用

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

      

    基类:
    public abstract class Biology
    {
       public abstract void Live();  
    }
    
    子类
    public class Animal:Biology
    {
       public override void Live()
      {
         cw("Animal重写的抽象方法");
      }
    }
    
    tips :抽象类中可以包含抽象类,也可以包含已经实现的。
             已经实现的类不能包含抽象类。
    

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

      public void Sleep(){
         cw("Animal Sleep");
      }
    
      在派生类cat中定义隐藏方法的代码为:
      new public void Sleep(){
         cw("Cat Sleep");
     }
     或
      public new void Sleep()
    {
        cw("Cat Sleep");  
    }
    
    tips:(1)隐藏方法不但可以隐藏基类中的虚方法,而且可以隐藏基类中的非虚方法
            (2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法
            (3)和上条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果调用的是父类的实例,那么调用基类的方法,如果引用的是派生类的实例,则调用派生类的方法。
    
    详细解说:
     class Program
        {
            static void Main(string[] args)
            {
                //Animal 的实例
                Animal a = new Animal();
                a.EatFood();
                //Animal 的实例,引用派生类Cat对象
                Animal ac = new Cat();
                ac.EatFood();
                ac.Sleep();
    
                Cat c = new Cat();
                c.Sleep();
                //Animal的实例,引用派生类Dog对象
                Animal ad = new Dog();
                Console.ReadKey();
    
            }
        }
    
        public abstract class Biology
        {
            public abstract void Live();
        }
    
        public class Animal : Biology
        {
            public override void Live()
            {
                Console.WriteLine("Animal重写的Live");
            }
    
            public void Sleep()
            {
                Console.WriteLine("Animal Sleep");
            }
    
            public int Sleep(int time)
            {
                Console.WriteLine("Animal在{0}点Sleep",time);
                return time;
            }
    
            public virtual void EatFood()
            {
                Console.WriteLine("Animal EatFood");
            }
        }
    
        public class Cat : Animal
        {
            public override void EatFood()
            {
                Console.WriteLine("Cat EatFood");
            }
            new public void Sleep()
            {
                Console.WriteLine("Cat Sleep");
            }
        }
    
        public class Dog : Animal
        {
            public override void EatFood()
            {
                Console.WriteLine("Dog EatFood");
            }
        }
    
    父类 animal   子类 cat
    当出现 Animal a=new Cat(); 时,调用的是父类的 的方法。
    当出现 Cat c=new Cat();时,调用的是子类的隐藏方法。
    

      

  • 相关阅读:
    190822——喜欢
    190821——彼岸无岸
    190820——随笔
    BLE——协议层次结构
    190817——肖申克的救赎
    190818——人
    190819——皖北部分村落的变迁史
    【转】vfork 和 fork的区别
    C语言文件操作
    【makefile】symbol <函数> : can't resolve symbol 问题分析
  • 原文地址:https://www.cnblogs.com/zmztya/p/5703463.html
Copyright © 2011-2022 走看看