ruby扫盲之多重继承
ruby的类是单一继承的方式,某个类只可以继承自一个父类。但是ruby的mixin让多重继承变得很容易。ruby引入了module的概念,module除了自身不能实例化外,拥有跟类几乎一样的属性,包括实例方法、实例变量等。
(当然,它的实例方法、实例变量只有通过include它的类被实例化后,才真正称之为“实例”。)
通过在类里include module,可以混入(mixin)其方法和属性,那么类等于实现了多重继承。
如下示例代码:module Mymod
attr_reader :names
def set_up(a)
@names = a
end
def add_name(name)
@names << name
end
def rm_name(name)
@names.delete(name)
end
end
class Myclass < Array
include Mymod
def initialize(*a)
super(a)
set_up(a)
end
end
x = Myclass.new("jessi","jane","joan")
x.push("jenn")
x.add_name("jeff")
x.delete("jane")
x.rm_name("jessi")
p x
p x.names先创建一个module,在里面定义了@name实例变量,和set_up、add_name、rm_name几个实例方法。
然后再定义一个类,这个类继承自Array(父类数组),然后在该类里include了上述module。
在类的构造器里,先调用super构造父类对象,再调用module里的set_up方法设置实例变量。
x = Myclass.new("jessi","jane","joan")
这样得到的对象x是一个数组对象,它既可以执行数组的方法(如push、delete),也可以执行module的方法(add_name、rm_name)。
一个类可以include多个module。通过这种方式,类也就实现了多重继承。
几点补充:
1. 类自身也是module:
> Class.is_a? Module
=> true
2. 类不是简单的拷贝module的实例方法,而是创建到module的引用。module的方法修改时,会影响到所有include它的类。
3. module也有initialize方法,类可以通过super来调用它。 不错不错啊。 mark一下 :emn10: 写的很好。{:2_176:} 写的很好。LZ继续哦。
页:
[1]