今天网易学院看到一篇介绍c#中多态性的文章,作者满嘴漏风的说:使用override来重载基类中的virtual函数,FT,看来这个老大是知道怎么回事,但是用词错误了,假如让新手看到,不把人家搞晕才怪呢。


重载Is overload  not override


在C#中,所谓的重载就是同一个类中不同签名的同名方法。当然调用时编译器会根据实参列表自动选择匹配形参列表的方法。 上面的那篇文章应该是指覆写。



覆写 is override


覆写这个概念只存在于继承关系的两个类中,基类的方法是virtual关键字标示的虚方法,子类是该虚方法的同名方法,使用了override关键字进行了覆写。

覆写override的关键意义在于,在使用父类的对象引用来引用子类的对象时,调用该同名方法,编译器会自动调用子类中的方法,而不是调用父类的方法。



覆盖 is new


假如父类中的方法并不是virtual的,子类中的方法也就无法使用override关键字进行覆写,而使用new关键字对父类中的方法进行覆盖,覆盖后,父类的对象引用来引用子类的对象时,进行调用该同名方法,会调用父类的方法,虽然实际上引用的是子类的对象。





看懂我下面的代码  我觉得你就理解了

下面是示例代码:


c#中的一些容易混淆的概念_覆写using System;

c#中的一些容易混淆的概念_覆写using System.Collections.Generic;

c#中的一些容易混淆的概念_覆写using System.Text;

c#中的一些容易混淆的概念_覆写

c#中的一些容易混淆的概念_覆写namespace Hello

c#中的一些容易混淆的概念_c#_06c#中的一些容易混淆的概念_子类_07c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09    interface IHello

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11    c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09        void sayHello();

c#中的一些容易混淆的概念_父类_14    }

c#中的一些容易混淆的概念_子类_09    class Hello : IHello

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11    c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09        public virtual void sayHello()

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11        c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09            Console.WriteLine("Hello!");

c#中的一些容易混淆的概念_父类_14        }

c#中的一些容易混淆的概念_父类_14    }

c#中的一些容易混淆的概念_子类_09    class HelloLee : Hello

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11    c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09        public override void sayHello()

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11        c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09            Console.WriteLine("Hello Lee!");

c#中的一些容易混淆的概念_父类_14        }

c#中的一些容易混淆的概念_父类_14    }

c#中的一些容易混淆的概念_子类_09    class HelloCoderLee : HelloLee

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11    c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09        public new void sayHello()

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11        c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09            Console.WriteLine("Hello CoderLee!");

c#中的一些容易混淆的概念_父类_14        }

c#中的一些容易混淆的概念_父类_14    }

c#中的一些容易混淆的概念_子类_09    class Program

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11    c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09        static void Main(string[] args)

c#中的一些容易混淆的概念_c#_10c#中的一些容易混淆的概念_覆写_11        c#中的一些容易混淆的概念_覆写_08{

c#中的一些容易混淆的概念_子类_09            IHello sayHello;

c#中的一些容易混淆的概念_子类_09            sayHello = new HelloCoderLee();

c#中的一些容易混淆的概念_子类_09            sayHello.sayHello();

c#中的一些容易混淆的概念_子类_09            Console.ReadLine();

c#中的一些容易混淆的概念_父类_14        }

c#中的一些容易混淆的概念_父类_14    }

c#中的一些容易混淆的概念_子类_62}

c#中的一些容易混淆的概念_覆写