JohnGong的P之路

从小工到专家,物流信息化在路上~
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#学习——继承接口多态

Posted on 2007-12-26 10:52  小强小工  阅读(742)  评论(0)    收藏  举报
 

隐藏与虚方法调用

子类要隐藏父类的同名方法,推荐在子类中使用new声明。注意若不使用new关键字,当方法相同时,调用哪个方法由对象变量的类型决定。

class Parent
    
{
        
public void HideF()
        
{
            System.Console.WriteLine(
"Parent.HideF()");
        }

    }

    
class Child : Parent
    
{
        
new  public void HideF()
        
{
            System.Console.WriteLine(
"Child.HideF()");
            
//base.HideF(); //调用基类被覆盖的方法
        }

}

 

虚方法:virtual,override,子类可以重写父类方法,当方法相同时,调用哪个方法由对象变量的类型决定

继承关系下的字段访问:子与父有相同名字的字段,使用哪个,由对象定义时的类型决定,与引用无关(注意以上面方法调用的区别)

 

继承下的对象创建与销毁

构造函数的目的:初始化成员

子类在创建时,先初始化自身成员(静态字段在实例字段之前初始化),再调用父类的构造函数,上溯到Object,而Object构造函数为空,一般也就看不到了。(IL中可以看到)

 

类的静态构造函数,不会自动调用基类的静态构造函数。

 

 

继承关系下的内存模型

 

实例字段的布局

 

静态字段的内存布局

 

注意静态字段分布在不同的类型表中

 

 

 

继承的虚方法内存布局

 

虚方法的调用,是在运行时根据对象的真实类型决定,不是在编译时确定的,因此CLR对虚方法调用采用了动态分派(Dispatch)的方法

 

简单说,按同样的索引查不同的表。

 

接口的虚方法内存布局


 

虚方法调用时:

1,CLR先查Iother类型表,知道g()的方法表索引为0

2,再查调用此方法的MyClass1类型所对应的接口偏移表,知道Iother接口在表中的偏移量为6。

3,两个相加(0+6),知道了MyClass1方法表的第7行(从0开始算)为真正要调用的方法。