Project1

标题: 关于alias和super的问题…… [打印本页]

作者: 黄亦天    时间: 2011-2-9 17:52
标题: 关于alias和super的问题……
本帖最后由 黄亦天 于 2011-2-9 22:32 编辑

例如我在某子类里定义父类已有的某方法:
  1. alias old_a a
  2. def a
  3.   old_a
  4.   p 2
  5. end
复制代码
  1. def a
  2.   super
  3.   p 2
  4. end
复制代码
这两者效果差不多,但是感觉貌似还是不怎么一样,以后再调用a方法的时候会有什么不同吗?
作者: 一箭烂YiJL    时间: 2011-2-9 18:20
super与子类和父类有关,详细见:
新手教程——super的作用和外界调用类中函数_(8)

那么alias是给就方法的新名字。比如:
  1. class x
  2.   def a
  3.     p "old"
  4.   end
  5.   alias old_a a
  6.   def a
  7.     p "new"
  8.   end
  9. end
  10. @x = x.new
  11. x.a         #=>new
  12. x.old_a  #=>old
复制代码

作者: 黄亦天    时间: 2011-2-9 18:29
回复 一箭烂YiJL 的帖子

alias 是重命名方法,但是也同样是继承了父类的方法
super 是调用了父类同名的方法
在子类中都对这个 a 方法进行了重定义
只是想知道,像在我举的例子中一样,会对以后父类该方法的调用、子类该方法的调用有什么不同的影响?
作者: 一箭烂YiJL    时间: 2011-2-9 20:11
回复 黄亦天 的帖子

虽然你这样用alias也可以达到相同super的效果,但是alias尽量不要用那么多,
而且本来alias不是专用于上层的用法,原意也非。
如果其他脚本也alias在左穿右插,弄得不好可能会出现死循环。
super要有父类才生效,无同名则错误。
alias不一定要有父类,上面有被覆盖的类即可,主要用于保留旧函数,
或者插进新脚本(又不想影响旧的)。如果其他脚本有a函数(那个类是继承另一个有a的函数),
自己脚本alias了a为old_a,(加上你的脚本在人家底下)然而就会alias了人家的那个。
再坏点的情况是人家那个a也用了alias,但a里面没有用alias出来的新函数名。(然后操作有误)
更不幸的就是死循环,这个不多说。

有时候需要到回调上两层,super就不能做到了。(没有super.super)
这样只有用alias从父类下手(下手方法有兴趣找我。)




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1