赞 | 23 |
VIP | 207 |
好人卡 | 31 |
积分 | 31 |
经验 | 48797 |
最后登录 | 2024-5-11 |
在线时间 | 1535 小时 |
Lv3.寻梦者 孤独守望
- 梦石
- 0
- 星屑
- 3132
- 在线时间
- 1535 小时
- 注册时间
- 2006-10-16
- 帖子
- 4321
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 IamI 于 2009-10-7 17:55 编辑
为那些会用脚本但是“不知道怎么就出了个Bug”的人而作。
(一) super
1 super的含义是,执行直接基类中的同名方法。
2 super的参数将被直接传递给基类中的同名方法。数量上不符合的,触发ArgumentError
3 如果直接写super,将会把这个方法的参数传递给基类中的同名方法,而不是什么都不传递。
如果写成“super()”,那么什么都不传递。
数量上不符合的,触发ArgumentError。
4 在子类中定义父类的方法,没有super的,父类方法被覆盖。有super的,于该位置执行父类的同名方法
空方法依然可以被super(如【VX】Scene_Base#update),用来进行统一化的基类计算。
5 super不能执行间接基类中的同名方法。如果想跳过直接基类,直接执行间接基类的方法,必须使用alias
6 super是关键字并且具有高优先级。
看不懂?没关系,本来就没希望你看懂= =下面的代码或许可以帮助你理解。如果您无法正常阅读这些代码,那么您还是去加强基本功吧。(喂)
1- class A
- def initialize
- p "call A initialize..." # 执行 4
- end
- end
- class B < A
- def initialize
- p "call B initialize..." # 执行 2
- super # 执行 3
- end
- end
- class C < B
- def initialize
- super # 执行 1
- p "call C initialize..." # 执行 5
- end
- end
- c = C.new # 执行 0
复制代码 应用:规则1、4
这是一张说明脚本运行的流程图……= =
2- class A
- def pass(para)
- p para
- end
- end
- class B < A
- def pass(para)
- super # 注意,super没有参数也没有括号,
- # 应用规则 3(1),参数列直接传给基类
-
- super(para) # 用规则 2 传递参数
- super() # 用规则 3(2) 传递参数,引发ArgumentError,
- # 因为提供了 0 个参数给A的pass方法
- # 综上呢……我们还可以说明,一个方法内可以写多个super= =
- end
- end
- b = B.new
- b.pass("Hello World")
复制代码 应用:规则2、3
是不是很难理解呢那么我们来拿Window_Base做例子吧。(注:下面的脚本必须加在Window_Base定义之后)
3- class Window_A < Window_Base
- def initialize(x,y,width,height)
- super # 直接传递出本方法的参数(x,y,width,height)
- p "Window_A initialize succeed..."
- end
- end
- a = Window_A.new(0,0,100,100)
- class Window_B < Window_Base
- def initialize(x,y)
- super(x,y,200,200) # 传递自己的2个参数和2个常数
- p "Window_B initialize succeed..."
- end
- end
- b = Window_B.new(0,0)
- # 啥?太简单了?看下面
- class Window_C < Window_Base
- def update(a)
- self.contents.draw_text(self.contents.rect,a,1)
- super
- end
- end
- # c的initialize方法没有重写,也就是Window_Base的
- # 所以仍然有 4 个参数
- c = Window_C.new(0,0,100,100)
- c.update("hi")
复制代码 由于super直接传递了本参数列,所以给了Window_Base的update一个莫名的参数a,于是悲剧。改成super()即可成功刷新。
应用:规则2、3
4【VX】- class Scene_Base
- def start
- p "Scene start..."
- end
- end
复制代码 应用:规则4(2)- class A
- def initialize
- p "call A init..."
- end
- def super
- p "call A super..."
- end
- end
- class B < A
- def initialize
- super
- self.super
- end
- end
- b = B.new
复制代码 应用:规则6
特别强调说明:以下类的子类,在initialize,update,dispose中必须调用super:
Window/Window_Base
Sprite
Viewport
Plane
Bitmap
家庭作业:看下面代码,预计会出现什么问题或者是通过,并输入查看结果。如果有错误,修改直到无故障。- class Sprite_Up < Sprite
- def initialize(string)
- super()
- @string = string
- self.bitmap = Bitmap.new(640,480)
- end
- def update(str)
- if @string != str
- @string = str
- refresh(str)
- end
- end
- def dispose
- end
- def refresh(str)
- super
- self.bitmap.draw_text(self.bitmap.rect,str)
- end
- end
- a = Sprite_Up.new("")
- for i in 1..300
- a.update("Hello World")
- Graphics.update
- end
- a.flash(Color.new(255,0,0),40)
- for i in 1..40
- Graphics.update
- end
- a.dispose
复制代码 如果您仍然无法理解,或者家庭作业无法完成,欢迎回帖讨论。
答案在14楼(孩子你寂寞了口胡) |
评分
-
查看全部评分
|