namespace ConsoleApp1 { public class A { public void P() { Console.WriteLine("这里是A的PP哦!"); } public void P(int a) { } public void P(bool a) { } public void P(int a, int b) { } } public class B : A { public new void P() { Console.WriteLine("这是B的PP!"); } } } namespace ConsoleApp1 { class Program { static void Main(string[] args) { _dictClass.Add(0, new A()); _dictClass.Add(1, new B()); _dictClass[0].P(); _dictClass[1].P(); (_dictClass[1] as B).P(); } private static Dictionary<int, A> _dictClass = new Dictionary<int, A>(); } }
首先解释下override与overload
翻译过来叫做重写和重载,笔者看来,二者的区别在两个方面表现的十分明显,首先是代码书写的区域,重载在一个类里面,重写则是子类对父类进行的重写,然后是表现优先级的不同,重写的表现优先级要高于被重写的对象,也就是说优先表现重写后的那个方法
namespace ConsoleApp1 { public class A { public virtual void P() { Console.WriteLine("这里是A的PP哦!"); } public void P(int a) { } public void P(bool a) { } public void P(int a, int b) { } } public class B : A { public override void P() { Console.WriteLine("这是B的PP!"); } } }
对代码稍微做下更改,输出结果:
重写的P优先级明显高于被重写的P。
注意:当深层次继承时,重写表现出来的总是最后一次被重写那个。
然后继续说重载,这里笔者总结了下,方法的类型无论如何,只要方法名字相同,它就是一个方法,重载直接影响的是方法里面的参数,看看百科的定义
“重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。”
再看看代码提示,不难实验,或者自己试一下。