先看两个示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ch10ex05 { public class MyBaseClass { public virtual void DoSomething() { Console.WriteLine("Base imp"); } } public class MyDerivedClass : MyBaseClass { public override void DoSomething() { Console.WriteLine("Derived imp"); } } class Program { static void Main(string[] args) { MyDerivedClass DerivedA = new MyDerivedClass(); MyBaseClass BaseA = DerivedA; BaseA.DoSomething(); Console.ReadKey(); } } }
运行结果是Derived imp。派生类的方法覆盖了基类中定义的方法。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ch10ex05 { public class MyBaseClass { public virtual void DoSomething() { Console.WriteLine("Base imp"); } } public class MyDerivedClass : MyBaseClass { new public void DoSomething() { Console.WriteLine("Derived imp"); } } class Program { static void Main(string[] args) { MyBaseClass BaseA; MyDerivedClass DerivedA = new MyDerivedClass(); BaseA = DerivedA; BaseA.DoSomething(); Console.ReadKey(); } } }
此时运行结果是Base imp。
派生类方法并没有覆盖基类方法,仅仅只是隐藏了而已。基类类型的BaseA即使和派生类DerivedA引用的对象一致,但是没有丢失基类的方法。