override 和 new

来源:互联网 发布:语文一对一网络辅导 编辑:程序博客网 时间:2024/06/05 20:08

先上代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace OverrideAndNew{    class Program    {        static void Main(string[] args)        {            Cat cat = new Cat();            cat.Eat();                // calls Cat.Eat()            cat.Go();                 // calls Cat.Go()            cat.catdonthave();            Animal animal_cat = (Animal)cat;            animal_cat.Eat();    // calls Cat.Eat()!            animal_cat.Go();      // calls Animal.Go()!            Animal animal = new Animal();            animal_cat.Drink();        }    }    class Animal    {        // Methods        public virtual void Drink()        {            Console.WriteLine("animal drink");        }        public virtual void Eat()        {            Console.WriteLine("animal eat");        }        public virtual void Go()        {            Console.WriteLine("animal go");        }        public virtual void catdonthave()        {            Console.WriteLine("cat don't have");        }    }    class Cat : Animal    {        // Methods        // warning: hides inherited drink(). Use new        public void Drink()        {            Console.WriteLine("cat drink");        }        // overrides inherited eat().        public override void Eat()        {            Console.WriteLine("cat eat");        }        // hides inherited go().        public new void Go()        {            Console.WriteLine("cat go");        }    }}

这里写图片描述

由上图可以看出 cat和animal的值和类型都是统一的,此时如果cat调用自身并不具有但是其父类含有的函数时(cat.catdonthave();),则调用父类函数。如果其调用自身含有的函数时,则调用自身函数。而animal只能调用自己的函数。

但是animal_cat的值和类型并不一致,animal_cat的类型为animal。此时 animal_cat调用函数时首先会去查看它指定的值是否有override此函数,如果有则调用这个值对应的函数,如果没有则调用自身的函数。

如果无override的情况下,添加new的意思则为这个函数与基类毫无关系。所以animal_cat在调用drink和go的时候,由于其无override,所以只会调用自身。

0 0