赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
这个机制确实可以用来实现多继承的工程,和 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,就无法实现所谓的“糅合”了
大家细心的话,应该就可以发现,对于include的外部模块,系统是优先调用原模块的方法,而后调用include模块中的方法,与C++中继承机制的调用顺序相反。
这个取决于 super 在原方法主体前还是后,甚至可能在中间,所以谈不上绝对的先后顺序 |
|