差异:override:覆盖父类分方法,new 隐藏父类方法。
共同:都不能改变父类自身方法。
public class Test { public string Name { get; set; } public virtual void SetName() { Console.WriteLine("parent"); } } public class Testchildren:Test { public override void SetName() { Console.WriteLine("children"); } public void Set() { base.SetName(); } } static void Main(string[] args) { var a = new Testchildren(); a.SetName(); ((Test)a).SetName(); a.Set(); Console.ReadKey(); } //输出:children children parent
再看看new
public class Test { public string Name { get; set; } public virtual void SetName() { Console.WriteLine("parent"); } } public class Testchildren:Test { public new void SetName() { Console.WriteLine("children"); } public void Set() { base.SetName(); } } static void Main(string[] args) { var a = new Testchildren(); a.SetName(); ((Test)a).SetName(); a.Set(); Console.ReadKey(); } //children parent parent
总结:调用内部base.set时,总是运行父类方法。override,外部调用set,总是运行子类set。new,外部调用set时,子类运行自己的set,隐式转换的父类也运行自己的set。
补充:那么new有三种用法,实例化,泛型约束,派生类隐藏基类方法。