Project1

标题: 关于越级继承…… [打印本页]

作者: 水镜风生    时间: 2010-11-7 16:29
标题: 关于越级继承……
本帖最后由 DeathKing 于 2010-11-14 08:45 编辑

我们知道Window_Command(以下简称WC) < Window_Selectable(WS) < Window_Base(WB)。

如果在WC的update方法里使用super,将继承WS的update方法,又因为WS的update里又有super,所以最终WC的update会继承WB和WS的update,问题是:我现在只想让WC的update继承WB的update,忽视WS的update定义,有什么方法可以办到呢?
作者: 沉影不器    时间: 2010-11-7 16:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水镜风生    时间: 2010-11-7 16:54
回复 沉影不器 的帖子

好方法!受教了,方法别名就应该这样用啊~
作者: 六祈    时间: 2010-11-7 18:57
沉影前辈的方法不错~愚者也来酱油一个~
在WS的update第一行插入:
if self.is_a?(Window_Command)
  super
return
end
作者: 禾西    时间: 2010-11-7 19:39
本帖最后由 禾西 于 2010-11-8 01:25 编辑

class A
  def initialize
    @a = 10
  end
  def meth1
    p @a
  end
end
class B < A
  def meth1
    @a += 1
    super
  end
end
class C < B
  def meth1
    @a += 2
    self.class.superclass.superclass.instance_method(:meth1).bind(self).call
  end
end
a = A.new
b = B.new
c = C.new
a.meth1 #=> 10
b.meth1 #=> 11
c.meth1 #=> 12

作者: DeathKing    时间: 2010-11-14 08:47
回复 禾西 的帖子

就是想问问bind是什么类类提供的方法。运行了ri上关于 Class#instance_method 的示范,竟然出错。
  1. C:\Documents and Settings\DeathKing>irb
  2. irb(main):001:0>         class Interpreter
  3. irb(main):002:1>           def do_a() print "there, "; end
  4. irb(main):003:1>           def do_d() print "Hello ";  end
  5. irb(main):004:1>           def do_e() print "!\n";     end
  6. irb(main):005:1>           def do_v() print "Dave";    end
  7. irb(main):006:1>           Dispatcher = {
  8. irb(main):007:2*            ?a => instance_method(:do_a),
  9. irb(main):008:2*            ?d => instance_method(:do_d),
  10. irb(main):009:2*            ?e => instance_method(:do_e),
  11. irb(main):010:2*            ?v => instance_method(:do_v)
  12. irb(main):011:2>           }
  13. irb(main):012:1>           def interpret(string)
  14. irb(main):013:2>             string.each_byte {|b| Dispatcher[b].bind(self).call
  15. }
  16. irb(main):014:2>           end
  17. irb(main):015:1>         end
  18. => nil
  19. irb(main):016:0>
  20. irb(main):017:0*         interpreter = Interpreter.new
  21. => #<Interpreter:0xdccad0>
  22. irb(main):018:0>         interpreter.interpret('dave')
  23. NoMethodError: undefined method `bind' for nil:NilClass
  24.         from (irb):13:in `block in interpret'
  25.         from (irb):13:in `each_byte'
  26.         from (irb):13:in `interpret'
  27.         from (irb):18
  28.         from D:/Program/ruby/bin/irb.bat:20:in `<main>'
  29. irb(main):019:0>
复制代码

作者: 禾西    时间: 2010-11-14 09:18
method類
作者: 苏小脉    时间: 2010-11-14 09:46
bind 是 UnboundMethod 的方法;Method 对象在创建的时候就已经绑定(bound)了。

六楼出错的原因是因为键值没匹配上。在 Ruby 1.9 中, `?' 跟着一个七位 ASCII 字符的字面值表式的不再是其在 ASCII 字符集中对应的整数码点了,而是一个单字节字符串对象,直接表示了这个字符。

  1. p ?a    # 97, Ruby 1.8
  2. p ?a    # "a", Ruby 1.9
复制代码
而 String#each_byte 传递给块的参数却是整型,表式了一个字节。将

  1. Dispatcher[b]
复制代码
改为

  1. Dispatcher[b.chr]
复制代码
即可




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