class Game_Party
include Train_Actor::Game_Party_Module
end
class Game_Player
include Train_Actor::Game_Player_Module
end
class Spriteset_Map
include Train_Actor::Spriteset_Map_Module
end
class Scene_Map
include Train_Actor::Scene_Map_Module
end
如果按照你的说法,那么调用update时就该调用原类里的方法,那么外部模块的update并不会被调用 作者: 独孤残云 时间: 2010-8-19 13:11 回复 六祈 的帖子
C++中的继承机制通常体现为:子类重写方法--->基类方法
Ruby中的include体现为:原有方法--->补充方法
如果
class A
include module B
End
按文中的说法,我是将B视为A的子类,其实这种说法可能并不是很严密。
六祈大人如果觉得有什么不妥,不妨将Game_Player.update()方法也加一句p输出,一试便知。
作者: 紫苏 时间: 2010-8-19 13:53
这个机制确实可以用来实现多继承的工程,和 Java、C# 的接口是相同的概念
在 Ruby 中,一个模块 A 包含另一个模块 B 后,模块 B 中的常量、类变量和实例方法会被绑扎到一个匿名模块中,并隐式地让模块 A 继承自这个匿名模块,所以如果在 Mix-in 的时候模块 A 中已经有了模块 B 中的实例方法,就会出项方法的覆盖,而在该方法中通过 super 就能调用父模块中的同名方法;然而如果子模块 B 中的该实例方法并没有调用 super,这个实例方法就不会调用匿名父模块的同名方法
楼主给的这个例子里之所以 TestInclude 的 update 被调用,是因为 Game_Player#update 里调用了 super。可以在 Game_Player#update 里的 super 前后分别插入 p 1、p 2,就不难验证上述理论。这种方法在 RGSS 默认类中的默认实例方法有 super 的情况下十分好用,但如果没有 super,就无法实现所谓的“糅合”了