C#中的成员修饰符new与override的区别

父类引用指向子类对象时调用方法,如果用是override重写,执行的是子类的方法;如果用的是new覆盖,执行的是父类的方法。如果看了上面那句话,你还不是很懂,请看下面的代码,就肯定能明白啦!.

public class BaseClass{    public virtual void PrintSomething()    {        Console.WriteLine("执行了 父类 方法!");    }}
public class DerivedClass : BaseClass{    public override void PrintSomething()    {        Console.WriteLine("执行了 子类 方法!");    }}
public static void Main(string[] args){    BaseClass instance = new DerivedClass(); //父类引用指向子类对象    instance.PrintSomeThing();}//输出:执行了 子类 方法!

如果换成new的话,请看下面:

public class BaseClass{    public virtual void PrintSomething(){        Console.WriteLine("执行了 父类 方法!");    }}
public class DerivedClass : BaseClass{    public new void PrintSomething(){        Console.WriteLine("执行了 子类 方法!");    }public static void Main(string[] args){    BaseClass instance = new DerivedClass(); //父类引用指向子类对象    instance.PrintSomething();}//输出:执行了 父类 方法!

现在明白了吧!如果是父类引用指向父类对象,当然是执行父类方法;同样滴,子类引用指向子类对象,当然执行子类方法;如果是父类引用指向子类对象呢?就是上面讲的:子类用override重写,该引用会向上传递到,执行子类方法;而如果是用new覆盖的话,相当于是对父类隐藏了此方法,故而执行父类方法。

结论:
override:
1. override是派生类用来重写基类中方法的;
2. override不能重写非虚方法和静态方法;
3. override只能重写用virtual、abstract、override修饰的方法;
4. 不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
new:
1. new是派生类用来隐藏基类中的方法的;也就是说在派生类中“看不到”基类中的方法,说白了,其实就是基类和派生类的这2个函数,虽然名字相同,但可以看成是名字不一样的2个函数,没啥联系,基类和派生类的函数是共存的。
2. 如果要在派生类中隐藏(不是重写)基类中的方法,而没有使用new关键字,编译时会出现一个警告,提示如果是要隐藏基类中的方法,请使用new关键字;
3. 派生类可以隐藏基类中的虚方法,也可以隐藏基类中的普通方法。
4. 如果在派生类中用private来修饰new 方法,那么只在该派生类中隐藏了基类中的方法,在该派生类之外,相当于没有隐藏基类中的方法;
5. 如果在派生类中隐藏了基类中的方法,在该派生类的派生类中,将延续对该派生类对基类方法的隐藏。