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

类别:.NET开发 点击:0 评论:0 推荐:

以前学习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没有关系。不过这也说明了我前面在理解多态时与实现技术绑得太紧,有些死板了。

本文地址:http://com.8s8s.com/it/it43014.htm