一、普通方式的继承
Ruby只支持单继承
ruby 代码
- class Child < Father
- ......
- 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,模块的方法会变为类方法。其原理如图: