作者timeregorge (vincent)
看板Ruby
标题[问题] 有关混合继承的顺序问题
时间Tue May 20 23:10:51 2014
大家好,小弟我又读到不懂的地方了,目前在类别继承和模组混和的部分
以下是程式码
module Walkable
def walk
"i'm walking."
end
end
module Swimmable
def swim
"i'm swimming."
end
end
module Climbable
def climb
"i'm climbing."
end
end
class Animal
include Walkable
def speak
"i'm an animal, and i speak!"
end
end
class GoodDog < Animal
include Swimmable
include Climbable
end
puts GoodDog.ancestors
结果为
Climbable
Swimmable
Animal
Walkable
Object
Kernel
BasicObject
我所读的部分有提到
因为混入的部分有包含和method相同的名称所以会首先找
最後一行,但上面我看不出哪边有相同命名的地方!
请大家帮我解释一下,万分感谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.175.57.146
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Ruby/M.1400598654.A.8DA.html
1F:推 mars90226:每次include一个module时,module就会被加进ancestors 05/21 00:00
2F:→ mars90226:你说的部分是指如果出现同名method,则从ancestors往上 05/21 00:01
3F:→ mars90226:找,越晚加入的ancestor的method越先使用 05/21 00:02
4F:→ mars90226:你目前是印ancestors,所以当然就是照着include顺序 05/21 00:03
5F:→ mars90226:的反过来就是了 05/21 00:03
您的意思是说,要是method有相同的名称的话才会先找,不然就会照着排序由下往上找吗?
感谢你的回覆!!
※ 编辑: timeregorge (1.175.57.146), 05/21/2014 10:38:02
6F:→ mars90226:不,不管甚麽method,都是从下往上找 05/21 10:46
7F:→ mars90226:你的问题是ancestors顺序吗? 这个顺序是从下往上没错 05/21 10:48
8F:→ putumaxally:我也没有看到有相同名称的 method, 这个例子举的不好 06/01 00:24
9F:→ putumaxally:这是哪里的范例?? 06/01 00:25
您好,因为我是在gotealeaf自学,这是gotealeaf他们自己编的教材的样子
因为是初学者 所以我其实也看得雾煞煞xd
※ 编辑: timeregorge (218.164.112.42), 06/02/2014 23:59:29
10F:推 lTERRAl:混合继承的状况 其实不用想的这麽复杂 06/07 01:56
11F:→ lTERRAl:由於ruby不让你实际做多重继承 (看看精美的C++...friend) 06/07 01:58
12F:→ lTERRAl:多重继承带来非常多混乱的问题 尤其大家都是friend... 06/07 01:59
13F:→ lTERRAl:所以ruby改用 composition 的方式来做成相同效果 06/07 02:02
14F:→ lTERRAl:先写成module再挂进class 好处是永远只处理单一线父子关系 06/07 02:03
15F:→ lTERRAl:坏处就是每当想要挂多个模组 就必须写出多个module来挂 06/07 02:06