论坛首页 编程语言技术论坛

Ruby 类的继承

浏览 3876 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-09  
一、普通方式的继承
 Ruby只支持单继承
 
ruby 代码
  1. class Child < Father   
  2. ......   
  3. end  


    Object是所有类的始祖,并且Object的实例方法对ruby的所有对象都是可用的。
    super的使用:
         1、在initialize中使用super,将调用其父类的initialize方法
         2、在一般的实例方法中使用,将调用其父类中同名的方法。
   向一个对象发送调用方法时,ruby的本质过程如下:
         1、ruby将检查该对象所属的类,如果该类实现了该方法,就运行该方法
         2、如果该类没有实现该方法,ruby将找到其直接父类中的方法,然后是其祖父类,凡此以往追溯整个祖先链
         3、如果最终没有找到合适方法,ruby会产生一个特殊的行为,引发异常错误
   (注意这里父类,如果该类中include了一个module,则ruby如果在该类中没有找到该方法定义是,会把module当成直接父类)


二、Mixin
       这个是ruby提供给模块的功能。类定义中,通过include一个模块。当类使用include后,模块的所有的实例方法(和常量)在该类中就可以使用了。下图显示了类和mixin模块之间的关系其原理是,当一个类包含一个模块时,Ruby创建了一个指向该模块的匿名代理类,并将这个匿名代理插入到实施包含的类中作为其直接超类。代理类中包含有指向模块实例变量和实例方法的引用。这个代理类是唯一指向底层模块:改变模块中某个方法的定义
   它将改变所有包含该模块的类。


    注意:
    1、模块和类的区别在于,模块不能实例化,类不能include
    2、如果模块和类不在同一个文件中,如果要使用include,则先使用require,把文件引入。
    3、include并不是简单的将模块的实例变量和方法拷贝到类中,而是,它是建立一个由类到所包含模块的引用。如果多个类
    引用该模块,都将指向同一个模块。
     4、如果有多个include,将依次生成代理类,最后一个include的将是该类的直接超类,依次向上衍生
    5、含有include的模块或类定义,可以访问它所包含的常量,类变量和实例方法。如果一个模块被包含,那么模块的常量,类变量,
    实例方法都被绑定到该类的一个匿名超类中,类的对象会响应发送给模块实例方法的消息。
    6、模块里可以定义一个initialize方法,当创建包括模块的类的对象是,如果满足如下条件之一,那么模块的该方法将被调用
       a、类没定义它自己的initialize方法
       b、类的initialize方法中调用了super
三、extend使用
   通过使用Object#extend将一个模块混合到类中,如果在类中使用extend,模块的方法会变为类方法。其原理如图:

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics