通过断点,可以看到,当执行pro.Fun();时,首先会跳到接口的实现方法里,然后去调用抽象函数的实现方法,当抽象函数的方法实现后,再回到接口的实现方法,直到执行完成。
当我们在实现接口的方法里调用虚函数呢?
interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() //注意这里是虚函数 { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public override void AFun() //这里是Override重写 { Console.WriteLine("I am override AFun."); } static void Main(string[] args) { IProgram pro = new Program(); pro.Fun(); Console.Read(); } } |
这时,我们发现,执行的顺序和上一个例子是相同的。所以结果为:I am override AFun.
由此,我们可以继续联想,当我们把override关键字,换成new呢?是不是也是同样的结果,还是和我们以前讲的例子一样,是隐藏呢?
我们把上面的例子进行改进:
interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public new void AFun() { Console.WriteLine("I am new AFun."); } static void Main(string[] args) { Program pro = new Program(); ((IProgram)pro).Fun(); pro.AFun(); Console.Read(); } } |
结果为:I am virtual AFun.
I am new AFun.