Project1
标题:
关于alias和super的问题……
[打印本页]
作者:
黄亦天
时间:
2011-2-9 17:52
标题:
关于alias和super的问题……
本帖最后由 黄亦天 于 2011-2-9 22:32 编辑
例如我在某子类里定义父类已有的某方法:
alias old_a a
def a
old_a
p 2
end
复制代码
def a
super
p 2
end
复制代码
这两者效果差不多,但是感觉貌似还是不怎么一样,以后再调用a方法的时候会有什么不同吗?
作者:
一箭烂YiJL
时间:
2011-2-9 18:20
super与子类和父类有关,详细见:
新手教程——super的作用和外界调用类中函数_(8)
那么alias是给就方法的新名字。比如:
class x
def a
p "old"
end
alias old_a a
def a
p "new"
end
end
@x = x.new
x.a #=>new
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