ruby类继承中的方法继承

c# 代码
  1. namespace ConsoleApplication1   
  2. {   
  3.     class Test   
  4.     {   
  5.         public static void Main()   
  6.         {   
  7.             B b = new B();   
  8.         }   
  9.     }   
  10.   
  11.     class A   
  12.     {   
  13.         public A()   
  14.         {   
  15.             Console.WriteLine("A");   
  16.         }   
  17.     }   
  18.   
  19.     class B : A   
  20.     {   
  21.         public B()   
  22.         {   
  23.             Console.WriteLine("B");   
  24.         }   
  25.     }   
  26. }  

这段程序的输出结果是
A
B

结果都不陌生,把这段程序用ruby重写

ruby 代码
  1. class A   
  2.   def initialize   
  3.     puts "A"  
  4.   end  
  5. end  
  6.   
  7. class B < A   
  8.   def initialize   
  9.     puts "B"  
  10.   end  
  11. end  

这段程序的输出是B,并非我想像中的
A
B

奇怪么?不奇怪,ruby的类在实例化的时候并不会去主动调用父类中的构造函数,也就是说,父类和子类的关系仅仅在于父类为子类提供一些可使用的方法而已,这些方法实际上放在父类自身的方法表或者父类单例类的方法表中:

ruby 代码
  1. class A   
  2. end  

在上面定义的这个类A的方法表中,没有保存任何方法,它所有的通过A.methods看到的方法,都是通过爬继承树得来的。当收到一个方法调用的消息时,ruby类首先会查找自己的方法表,若方法表中没有,就会沿着继承树向上爬,去祖宗类中去找,所以,当我们调用A.new的时候,就会沿着继承关系到Object,Kernel等里面去找这个new方法和initialize方法,在之前B继承A的例子中就可以看到,因为B本身的方法表中已经具有了initialize这个方法,new调用就不会去爬继承树找A中的initialize方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值