解析.net中继承的实质

http://tech.ddvip.com   2008年09月06日    社区交流

本文详细介绍解析.net中继承的实质

  在csdn论坛、博客园里都有很多帖子讨论c#中继承语法的问题,大家乐此不疲的解释virtual,override,new,final,接口,类中的继承。各种各样的例子让新手头晕脑胀,这其中还一些地方以讹传讹。

  比如这篇文章里面竟然说“编译器会顺着继承链往下找,一直找到合适的那个方法体”,在回复里还有人说“这个特征特现了C#编译器对里氏代换原则的支持。也就是:凡是基类适用的地方子类一定适用。

  比如class Base {},class Sub:base {} 如果:Base a=new Sub();那么实际上编译器已经能够确定a所指向的对象的类型。所以方法的地址确实是在编译期就确定了的。”。我真是无语了,override的实现本质上是非常简单的,但由于每次都是从语法的角度讨论问题所以总是不得要领。

  所以我这篇帖子的将从底层实现的角度来向你说明override的实现。首先让我们明确2个概念:

  1.类实例的方法调用都是虚调用(callvirt)只有在调用基类方法时是实调用(call)。请看代码:

1. class A
  2.   {   
  3.     public void Boo()
  4.     {
  5.       Console.WriteLine("A::Boo().");
  6.     }
  7.     public virtual void Foo()
  8.     {
  9.       Console.WriteLine("A::Foo().");
 10.     }    
 11.   }
 12.   class B : A
 13.   {   
 14.     public override void Foo()
 15.     {
 16.       Console.WriteLine("B::Foo().");
 17.       base.Foo();
 18.     }
 19.   }
 20.   class Class1
 21.   {
 22.     public static void Main()
 23.     {
 24.       A a = new A();
 25.       a.Foo();
 26.       a.Boo();
 27.       A b = new B();
 28.       a.Foo();
 29.       a.Boo();
 30.     }
 31.   }

来源:blog.csdn    作者:傅晗    责编:豆豆技术应用

正在加载评论...