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

  

 

posted @ 2016-07-25 14:44  zmztyas  阅读(280)  评论(0编辑  收藏  举报