zuerrong 发表于 2010-11-26 12:05

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来调用它。

2gua 发表于 2010-11-27 11:05

不错不错啊。

ziyiu123 发表于 2011-02-22 18:58

mark一下 :emn10:

liugang9931706 发表于 2011-03-03 05:38

写的很好。{:2_176:}

gr33n 发表于 2011-11-19 23:32

写的很好。LZ继续哦。
页: [1]
查看完整版本: ruby扫盲之多重继承