c# 代码
- namespace ConsoleApplication1
- {
- class Test
- {
- public static void Main()
- {
- B b = new B();
- }
- }
- class A
- {
- public A()
- {
- Console.WriteLine("A");
- }
- }
- class B : A
- {
- public B()
- {
- Console.WriteLine("B");
- }
- }
- }
这段程序的输出结果是
A
B
结果都不陌生,把这段程序用ruby重写
ruby 代码
- class A
- def initialize
- puts "A"
- end
- end
- class B < A
- def initialize
- puts "B"
- end
- end
这段程序的输出是B,并非我想像中的
A
B
奇怪么?不奇怪,ruby的类在实例化的时候并不会去主动调用父类中的构造函数,也就是说,父类和子类的关系仅仅在于父类为子类提供一些可使用的方法而已,这些方法实际上放在父类自身的方法表或者父类单例类的方法表中:
ruby 代码
- class A
- end
在上面定义的这个类A的方法表中,没有保存任何方法,它所有的通过A.methods看到的方法,都是通过爬继承树得来的。当收到一个方法调用的消息时,ruby类首先会查找自己的方法表,若方法表中没有,就会沿着继承树向上爬,去祖宗类中去找,所以,当我们调用A.new的时候,就会沿着继承关系到Object,Kernel等里面去找这个new方法和initialize方法,在之前B继承A的例子中就可以看到,因为B本身的方法表中已经具有了initialize这个方法,new调用就不会去爬继承树找A中的initialize方法。