设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2149|回复: 6

[已经解决] XP脚本当中继承关系,Super()运行的流程。

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14096
在线时间
2139 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

发表于 2019-3-9 15:18:33 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 miantouchi 于 2019-3-9 17:39 编辑

我的依据:
第一:super 将调用被当前方法覆盖的父类中的同名方法
第二:继承关系,Window_Command < Window_Selectable < Window_Base < Window
第三:self当前方法的执行对象本身。注:太抽象了,我根本理解不来,self你到底是谁?

不知道我理解的过程对不对,大家帮我看看
首先class Scene_Menu这个类里面下面这句
第一步:@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
实例化Window_Command这个类,实例是@command_window,同时传递,宽:160,和数组元素S1-S6。
第二步:紧接着跳转到Window_Command类的界面进入initialize(width, commands)
方法中执行super(0, 0, width, commands.size * 32 + 32)
第三步:接着跳转到Window_Selectable类initialize(x, y, width, height)
方法中执行super(x, y, width, height)
第四步:再跳转到Window_Base类的界面initialize(x, y, width, height)
方法中执行super()
第五步:最后跳转到Window类,执行initialize方法

问题1:但是我发现F1里面Window类并没有initialize方法,那Window_Base 当中的super()到底调用谁呢?
问题2:我这么想是不是很绕,例如儿子找爸爸,爸爸找爷爷,爷爷找太爷爷.......
问题3:这段不是实际代码,就是我的思维图

第二步:Window_Command类的界面进入initialize(width=160, commands = [s1, s2, s3, s4, s5, s6])
                                            super(0, 0, 160, 6 * 32 + 32)
第三步:接着跳转到Window_Selectable类initialize(0, 0,160,6 * 32 + 32)
                                               super(0, 0,160,6 * 32 + 32)  
第四步:再跳转到Window_Base类的界面initialize(0, 0,16,6 * 32 + 32)
self.x = 0
self.y = 0
self.width = 160
self.height = 6 * 32 + 32
是这个过程吗?赋值给Window类x,y,width,height

我只能分析各4步,接下来就不清楚了,self起到什么作用呢?欢迎大家接着分析下去,看看我前几步分析的有没有问题。
1.png
2.png
3.png
4.png
流程图.png

Lv5.捕梦者

梦石
0
星屑
37754
在线时间
5385 小时
注册时间
2006-11-10
帖子
6545
发表于 2019-3-9 16:28:41 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-9 16:37 编辑

1,  F1, 搜索 Window, 你会发现 ,它还有父类, initialize就在那里,

而Window_Base 的initialize, 把从它子类的super里得到的参数, 用来赋值给Window的x, y , width, height, 从而得到实际的坐标和宽高

  def initialize(x, y, width, height)
    super()
    @windowskin_name = $game_system.windowskin_name
    self.windowskin = RPG::Cache.windowskin(@windowskin_name)
    self.x = x
    self.y = y
    self.width = width
    self.height = height

    self.z = 100
  end

2,  你第二步,  super(0, 0, 160, 6 * 32 + 32) , 这不是 x, y , width, height 都齐了么?

点评

self.是指自己, 也就是调用这个实例的对象本身  发表于 2019-3-9 17:41
我重新编辑了下,self.是指的父类参数啊  发表于 2019-3-9 17:03
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37754
在线时间
5385 小时
注册时间
2006-11-10
帖子
6545
发表于 2019-3-9 17:36:34 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-9 18:17 编辑

继承关系, 用个栗子来说

比如, 星矢有个儿子,叫星活,

class 星活 < 星矢              (实际上不能用汉字作为类名哦, 这里只是示范, 别误导了)

星矢会天马流星拳, 一夜18次...阿呸, 一秒18次
class 星矢
   attr_accessor  :天马流星拳
   def initialize
      @天马流星拳 = 18
   end
end

星活用super 继承了老爸的方法, 也会天马流星拳了             (实际上实变量不需要super,一样继承的, 这里为了让你明白就多此一举, 一般来说super是用于继承父类的方法同时还要增加新的函数的时候用)
class 星活 < 星矢
    def  initialize
       super
    end
end

这个时候, p 星活.天马流星拳 #=> 18   , 他完整的继承了老爸的方法  
后来, 星活改进技术, 他的天马流星拳有28拳

class 星活 < 星矢
    def  initialize
       self.天马流星拳 = 28
    end
end

这个时候, p 星活.天马流星拳  #=> 28,  而 p 星矢.天马流星拳 #=> 18

子类可以给父类继承来的实变量重新赋值, 这个赋值只针对引用这个实例的对象,  而不影响其他人

p 星蹦.天马流星拳   #=> 18
p 星乱.天马流星拳   #=> 18
p 星跳.天马流星拳   #=> 18

点评

菜刀格言: 无法理解的话就硬记, 用多了自然理解它的规则了,笑  发表于 2019-3-9 18:14
答题意思明白了,对象继承这东西真是难以理解透彻  发表于 2019-3-9 18:06

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-19 09:47

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表