C#学习日记 - 2004/11/04

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 graycat 的 blog

以前学习c++时,有一段时间对继承和多态的理解总不是很透彻;后来看了stanley lippman的《inside the c++ object model》一书,存在的不少疑问就迎刃而解了。近一段时间在学习.net时,这种从物理实现来理解面向对象的思维反而给我带来了麻烦。比如,我觉得继承类应该是包含基类的所有数据成员(field)的,如果这样理解,就无法解释下面的现象:object是reference type,而refence type按照现在的实现,是有8个额外字节的object header(用于数据同步和跟踪type信息之用); 但是为什么它的子类valuetype就没有了这8个额外字节的负担呢?其实,继承只能从逻辑上去理解,只要保证基类具有的行为继承类也具备就可以了,至于说基类的数据成员(指对继承类可见的非private成员),必须是在当前层次上能够看到的成员,而前面提到的8字节的object header,无论对于il还是c#语言来说都是看不到的,继承类有没有这种级别的数据成员,并不妨碍继承在语义上的完整性。对于多态的理解倒没有碰到大的障碍,但是另外一个问题也困扰了我一些时间:在看rotor的代码时,发觉所有的方法都是通过method table来调用的,即使该方法是instance method也是如此。这好像和我学习c++时只有virtual method才能够通过vtable来调用的方式不一样。后来在看了don box的《.net essential》才恍然大悟,由于所有方法在调用前都是il语言,需要在运行时通过jit编译为native code;引入一个间接的method table,使该方法在被编译之前指向jitter(即时编译器),编译之后method table指向的地址变为native code,通过这种处理方式,在实现层处理方法调用就比较一致了。这完全是一个实现层面上的技巧,与该方法是不是virtual method没有关系。不过这也说明了我前面在理解多态时与实现技术绑得太紧,有些死板了。

本文关键:C#学习日记 - 2004/11/04
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top