查看: 5417|回复: 18

[已经解决] 有关方法重载的一个悲剧

[复制链接]
梦石
0
星屑
1580
在线时间
1564 小时
注册时间
2008-7-30
回帖
4207

贵宾

发表于 2010-7-22 12:01:28 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 DeathKing 于 2010-7-22 12:51 编辑

我最近正在慢慢研究ZTBS系统,为了稍微修改一下系统,我添加了一个叫做Fuki Help的帮助窗口,就像下面这样:

fuki_help_1.jpg

但是如果就这样的话,会导致那个小箭头没办法释放:

fuki_help_2.jpg

于是我就重载了visible=这个方法,我的想法是:当这个help_window的可见性被设置为false时,我就把这个小箭头给释放掉:

  1.   alias :dk_visible= :visible=
  2.   def visible=(value)
  3.     unless value
  4.       @fuki.bitmap = nil if @fuki.is_a? Sprite
  5.     end
  6.     dk_visible=(value)
  7.   end
复制代码
最后小箭头是释放掉了,但是窗体的却还是可见。我用反射机制看了看Window类,发现visible不是实例变量而是visible和visible=两个方法。

我上面的写法都没错啊,到底是怎么回事,需要工程么?

点评

听到的叫法太多了……有时候不知道用什么 - -  发表于 2010-7-22 19:30
其实严格来说这个应该叫方法覆盖(覆盖由父类继承的方法),Ruby 由于有 duck type 所以似乎默认没有重载功能……  发表于 2010-7-22 19:28

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更

孤独守望

梦石
0
星屑
3144
在线时间
1535 小时
注册时间
2006-10-16
回帖
4223

开拓者贵宾

发表于 2010-7-22 12:21:19 | 显示全部楼层
……你又囧了,直接赋值为nil当然还在,dispose啊……
另外,C类(内置类全部都是)当中只能改方法,没有变量……因为变量隐藏在C类中
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复

使用道具 举报

梦石
0
星屑
1580
在线时间
1564 小时
注册时间
2008-7-30
回帖
4207

贵宾

 楼主| 发表于 2010-7-22 12:22:16 | 显示全部楼层
回复 IamI 的帖子

@fuki是那个小箭头,我还要用的,所以不想要释放掉。
我说的是窗口。
   
回复

使用道具 举报

旅之愚者

梦石
0
星屑
560
在线时间
814 小时
注册时间
2007-7-28
回帖
2121

贵宾

发表于 2010-7-22 12:29:44 | 显示全部楼层
回复 DeathKing 的帖子

死君要改名做囧君了么~~~~~~~~

话说不太明白你的情况
不过愚以为窗体(window)用完都是dispose的。。。


   

点评

ZTBS的原帮助窗体也是最后才释放,其他场合都不可见,指向角色时可见。  发表于 2010-7-22 12:40
节约内存。。。  发表于 2010-7-22 12:37
窗体要用 - - 一直释放、创立你会不会觉得有点那啥呢?  发表于 2010-7-22 12:35
回复

使用道具 举报

风雪夜不归人

梦石
0
星屑
50
在线时间
276 小时
注册时间
2006-3-7
回帖
6441

贵宾

发表于 2010-7-22 12:32:46 | 显示全部楼层
不如去掉那个小箭头吧,对于玩家来说,有没有都一样吧?

点评

因为用了Fuki对话框,我想做到效果一致,而且那个小箭头也可以明确指出是那个角色。  发表于 2010-7-22 12:36
有些人,到了七八月份就会诈尸。
宫斗,是女生永远的爱。
冷门,是本人不变的欲。
作弊,是玩家自由的痛。
练级,是橙光割舍的情。
回复

使用道具 举报

孤独守望

梦石
0
星屑
3144
在线时间
1535 小时
注册时间
2006-10-16
回帖
4223

开拓者贵宾

发表于 2010-7-22 12:34:00 | 显示全部楼层
世界喜感……去掉重载方法名内的等号,世界清静了……
  1. class Window_K < Window
  2.   alias :dk_visible visible=
  3.   def visible=(value)
  4.     unless value
  5.       p "Set"
  6.     end
  7.     dk_visible(value)
  8.   end
  9. end

  10. a = Window_K.new
  11. a.visible = false
  12. p a.visible
  13. a.visible = true
复制代码
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复

使用道具 举报

梦石
0
星屑
1580
在线时间
1564 小时
注册时间
2008-7-30
回帖
4207

贵宾

 楼主| 发表于 2010-7-22 12:37:31 | 显示全部楼层
回复 IamI 的帖子
    的确可行,求原因,是alias的bug么?

   
回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-7-22 12:38:05 | 显示全部楼层
可以通过显式指定 self 为接受者来告诉解释器这是一个方法

点评

=b= 那我还是上传到论坛附件好了~  发表于 2010-7-22 14:15
紫苏酱内签名挂鸟~  发表于 2010-7-22 12:47
求原因,另外,头像……的确是紫色的。  发表于 2010-7-22 12:43

评分

参与人数 1星屑 +600 收起 理由
IamI + 600 其实个人习惯是300点喵

查看全部评分

回复

使用道具 举报

梦石
0
星屑
425
在线时间
0 小时
注册时间
2010-7-2
回帖
1
发表于 2010-7-22 12:38:06 | 显示全部楼层
嘛一般不是可以直接@sprite.visible = @help_window.visible 吗?一般我喜欢在update里插入

点评

因为这个窗体并没有一直刷新,是被动刷新,只有当我调用set_actor等方法后才刷新。(Window_Help)  发表于 2010-7-22 12:42
因为这个窗体并没有一直刷新,是被动刷新,只有当我调用set_actor等方法后才刷新。(Window_Help)  发表于 2010-7-22 12:41
回复

使用道具 举报

孤独守望

梦石
0
星屑
3144
在线时间
1535 小时
注册时间
2006-10-16
回帖
4223

开拓者贵宾

发表于 2010-7-22 12:38:38 | 显示全部楼层
回复 DeathKing 的帖子
鬼才知道= =我们来看个更喜感的东西吧 囧
  1. class Window_K < Window
  2.   alias :dk_visible= visible=
  3.   def visible=(value)
  4.     unless value
  5.       p "Set"
  6.     end
  7.     self.dk_visible = value
  8.   end
  9. end

  10. a = Window_K.new
  11. a.visible = false
  12. p a.visible
  13. a.visible = true
复制代码

点评

完美解决  发表于 2010-7-22 12:46
和 alias dk_visible visible= 效果一样  发表于 2010-7-22 12:45
求运行结果 =y=  发表于 2010-7-22 12:44
表示没有工程看不到喜感,心里很痒  发表于 2010-7-22 12:39

评分

参与人数 1星屑 +200 收起 理由
DeathKing + 200 请帮忙认可紫苏,XP是100点吧? ...

查看全部评分

菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部