(施工中)【用代码说话】#3.super star

上一篇教程中,我和无辜的史莱姆一起介绍了面向对象的基本知识,让我稍微有些失落的是有很多人反映看不懂……稍微反省了一下之后,我决定这一篇稍微降低一些内容的深度,转而增加更多的趣味性,正因为如此,即使现阶段无法完全理解第二篇中后半部分的内容也没关系,在第三篇以及后续更多的篇章中那些知识还将反复出现和巩固。
言归正传,如同上一篇最后所预告的,在这一篇中将讲解的是继承的概念。在开始正篇的内容前,先来暴露一下年龄补充一个知道了也没什么用处的豆知识,大概是在我上小学那会儿,我家乡那个三线小破城市的各大服装店、超市以及快餐店曾经循环播放着一个名叫“射”的女子卫衣销售组合的歌,至于这首歌的名字,没错,就是这一篇教程的标题——《super star》,借着这首歌最有名的一句歌词:“你是电你是光你是卫衣的神话”,这一篇,我们将要看到一段和它有关的代码……

【用代码说话】#3.super star

class Electric
  def who?
    p "You are Electric"
  end
  def love(who)
    p "#{who} are my super star"
  end
end
class Light < Electric
  def who?
    super
    p "You are light"
  end
  def love(star)
    p "I only love You"
    super star
  end
end
mwm5 = Light.new
mwm5.who?
mwm5.love 'you'

请不要借助任何代码执行工具,阅读上面的代码并思考,输出的结果是什么?

施工中……

(施工中)【用代码说话】#3.super star》上有9条评论

  1. 大佬写的教程真不错,简单易懂。
    我现在对脚本的了解还是停留在修改几个窗口和内容的程度,请问下该怎么学才能写得出更好更实用的脚本?

  2. 创建类A,实例变量text可读,定义给实例变量@text赋值‘hello‘的实例方法hello,结束类A的定义。
    创建类A的子类B,然后就有点懵了,super不是只继承父类的同名方法吗?类A并没有类B的实例方法text的同名实例方法啊?
    然后再在子类B里定义和父类A同名的实例方法hello,内容是继承父类A的实例方法‘hello’,第二行是并显示子类B的实例方法text所返回的值,结束子类B的定义。
    生成子类B的实例a,实例a调用子类B的实例方法hello,返回的是‘helloworld’。
    大致只能这样了解,因为很多教材好像都只是提到super继承父类的同名方法……

  3. 关键是不是子类B的第二个定义的实例方法里,继承了父类A方法的返回值也能传递到第二行子类B之前定义的实例方法text里?
    class A
    attr_reader :text #~ 让实例变量text可读
    def hello
    @text = ‘hello’ #~ 实例变量text赋值字符串‘hello‘
    end
    end
    class B < A
    def text
    super + 'world' #~ 继承父类方法?(没有子类B的实例方法hello不能单独用实例调用)
    end
    def hello
    super #~ 继承父类方法hello
    p text #~ 方法内容的super也相当于继承了父类的方法?
    end
    end

    • 所以这便是要让你了解ruby语法的原因,ruby 实际上是一门基础规则很简单,但是却有一堆语法糖的语言,所以对于熟悉 ruby 的人来说,有些用法似乎非常自然根本不用学习,而对于不熟悉 ruby 的人来说,ruby 似乎处处都是需要额外记忆的古怪规则
      所以,让你懵了的这段代码:
      attr_reader :text
      作用确实是让实例变量text可读,但实际上是下面这段代码的简写:
      def text; return @text; end
      把这个内容替换进去,整个逻辑是不是就好理解多了?
      class A
      def text
      return @text
      end
      def hello
      @text = 'hello'
      end
      end

      当然,这段代码还额外包含了下面这些 ruby 语法的规则:
      如果方法没有返回值,就用最后一个表达式的值作为方法的返回值
      使用 text 时,先检查有没有这个名字的局部变量,再检查有没有这个名字的方法的方法冒泡查找……
      ……

    • 回到最开始的问题,
      要想更进一步的前进,个人是建议你先通过一个比较完整的教程(比如各种书籍,我自己当初看的是《Ruby编程语言》这本,网上都能找到PDF)而非一些快速入门来走马观花的大致了解 ruby 的基本语法,知道哪些是 ruby 语法的规则,哪些则是 attr_reader 这样的语法糖

      之后,开始看看 RGSS3 默认的脚本,一开始也不用全部从头看起,先看 Window_Help ,了解它的代码在干什么,这时候你可能会碰到 contents 这个东西,先不用理解它是什么,看看 Window_Help 的父类 Window_Base 都是怎么用这个 contents 的,模仿着用它改一个显示更多信息的帮助窗口出来

发表评论

电子邮件地址不会被公开。 必填项已用*标注