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();时,调用的是子类的隐藏方法。
    

      

  • 相关阅读:
    IOS Charles(代理服务器软件,可以用来拦截网络请求)
    Javascript中addEventListener和attachEvent的区别
    MVC中实现Area几种方法
    Entity Framework Code First 中使用 Fluent API 笔记。
    自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
    Code First :使用Entity. Framework编程(8) ----转发 收藏
    Code First :使用Entity. Framework编程(6) ----转发 收藏
    Code First :使用Entity. Framework编程(5) ----转发 收藏
  • 原文地址:https://www.cnblogs.com/zmztya/p/5703463.html
Copyright © 2011-2022 走看看