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

Project1

 找回密码
 注册会员
搜索
查看: 9672|回复: 20

[RMVX发布] 新手教程——super的作用和外界调用类中函数_(8)

[复制链接]

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4739
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
发表于 2011-1-8 15:28:45 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 一箭烂YiJL 于 2011-4-25 17:19 编辑

课序号:8
作者:一箭烂YiJL
出版社:VX教程出版社
售价:完全免费
VX教程出版社的其它教程

上一课:
新手教程——简单测试法x2_(7)


序:
xxxxxxxxxxxxxxx(过往话的屏蔽= =第二次的教程合集请勿将此写入)
废话少说,这次是说的是super的作用和外界调用类中函数


正式开始:
上几次说了super有传输参数的作用,其实这是不止的。
一个类中调用自己的函数就直接打名字,而调用外界函数(我比较喜欢叫公式)又怎么呢?
还有子父类的深层关系。
这次教程高度符号化,不会有太多文字解释


A.外界调用类中函数:
意思很简单,就是在不在当前类中调用类的函数。

  1. class A
  2.   def b
  3.     p 100
  4.   end
  5. end

  6. @a = A.new  # 建立A类为@a
  7. @a.b             # 代指调用A类的b函数
复制代码
最终窗口输出:

  1. 100
复制代码
重点在@a.b它已经代指调用A类的b函数。


然后我们看看子父类的函数关系

  1. class B
  2.   def b
  3.     p 200
  4.   end
  5. end
  6. class A < B   # 类中无物请勿奇怪
  7. end
  8. @a = A.new
  9. @a.b
复制代码
然后输出:
  1. 200
复制代码
现在我们就知道了,子类会继承父类的函数


若果子类和父类里都有同一函数,会怎么样呢?

  1. class B
  2.   def b
  3.     p "B类"
  4.   end
  5. end

  6. class A < B   # 类中无物请勿奇怪
  7.   def b
  8.     p "A类"
  9.   end
  10. end

  11. @a = A.new
  12. @a.b
复制代码
最终输出:
  1. "A类"
复制代码
我们得知:输出最近(靠后定义)的函数会覆盖之前的同名函数
那有什么方法两个都能做呢?
请看下一部分:super



B.super主要用途:
super的关键在于子父类同名函数之间,不多说,自己看:

  1. class B
  2.   def b
  3.     p "B类"
  4.   end
  5. end

  6. class A < B
  7.   def b
  8.     super
  9.   end
  10. end

  11. @a = A.new  # 建立A类
  12. @a.b             # 代指
复制代码
最终输出:
  1. "B类"
复制代码
这样就知道了:super会调用父类的同名函数。


那么这样呢?:
  1. class B
  2.   def b
  3.     p "B类"
  4.   end
  5. end

  6. class A < B
  7.   def b
  8.     super
  9.     p "A类"
  10.   end
  11. end

  12. @a = A.new
  13. @a.b
复制代码
最终输出:
  1. "B类"
  2. "A类"
复制代码
(这里只要明白原理就好了)


那么在搞一个更复杂的呢?:
  1. class B
  2.   def b
  3.     p "B类"
  4.   end
  5. end

  6. class A < B
  7.   def b
  8.     super    # 这里经过discain的提点后加回来了
  9.     p "A类"
  10.     super
  11.   end
  12. end
  13. class C < A
  14.   def b
  15.     super
  16.     p "C类"
  17.   end
  18. end

  19. @c = C.new
  20. @c.b
复制代码
最终依次输出:
  1. "B类"
  2. "A类"
  3. "B类"
  4. "C类"
复制代码
这只是逻辑思考的输出。
好了,不要说的太远了,super说了这里就好了。


总结,我们学习了:
1.super的作用
2.外界调用类中函数
有兴趣的童鞋可以看看C增值站。



看完教程请回复!!


下一课:
暂无




C.增值站
为了更多回复和新手的前途,我在这里设立了C。

既然刚才说了子类会承继所有父类的函数,那么Window_Base会提供了不少功能?
的确的,很多时候我们都会见到窗口里有:
  1. draw_XXXX
复制代码
比如draw_face、draw_actor_level、draw_actor_name
尤其可以在Window_Status里发现。(这是"状态"窗口)

那么我就委派你们做一个draw_VX
成功条件:在任何承继Window_Base的窗口能用"draw_VX"
绘画出"VX教程出版社"的字样,并且是有参数"draw_VX(X坐标, Y坐标, 宽度)"

提示:
第二课学过的"self.contents.draw_text(x, y, 高度, 宽度, 显示的变数)"来绘画字样
第X课学过的参数。就是"def draw_VX(参数们)"
在Window_Base里任何一个建立新函数。


欢迎大家讨论增值站答案。


好了,这节课上完了,谢谢大家。
(要回复啊~!)

评分

参与人数 1星屑 +24 收起 理由
Rion幻音 + 24

查看全部评分

Lv1.梦旅人

梦石
0
星屑
88
在线时间
308 小时
注册时间
2010-8-10
帖子
794
发表于 2011-1-8 16:02:49 | 显示全部楼层
本帖最后由 不是马甲 于 2011-1-8 16:03 编辑

沙发 ?  表示很好 希望楼主继续加油

点评

嗯,谢谢了~  发表于 2011-1-8 19:29
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
73
在线时间
122 小时
注册时间
2009-2-7
帖子
55
发表于 2011-1-8 20:26:31 | 显示全部楼层
最终依次输出:
01."B类"
02."A类"
03."B类"
04."C类"
-------------------------------
这个好像是错误的,怎么看输出的都应该是
"A类"
"B类"
"C类"

点评

嗯,谢提点,本来A类有两个super,我打少了。(可以关注修改后的那一个哦~)  发表于 2011-1-8 22:50
回复 支持 反对

使用道具 举报

Lv1.梦旅人

万物创造者

梦石
0
星屑
54
在线时间
352 小时
注册时间
2008-2-15
帖子
2432
发表于 2011-1-8 20:44:05 | 显示全部楼层
看完的来回贴,附带bug一只:“这样就知道了:super会调用父类的用名函数。”
”外界调用类中函数““调用函数是找最近的“这种说法感觉有些不妥,“外界调用”实为类的实例变量调用其类中的方法,要说”外界调用类中函数“感觉更像调用类方法(class <<A这样);“调用函数是找最近的“应该说是”最近(靠后定义)的方法会覆盖之前的同名方法“比较好{:nm_3:}
From mortal hope immortal power springs.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
518 小时
注册时间
2010-6-16
帖子
1073
发表于 2011-1-8 21:55:14 | 显示全部楼层
一箭兄哪会没名望呢~发布区的教程部分都是箭兄的呢~{:nm_5:}

点评

是吗?我好安慰哦~  发表于 2011-1-8 23:03
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4739
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
 楼主| 发表于 2011-1-8 22:49:01 | 显示全部楼层
回复 小幽的马甲 的帖子

嗯,我的"用名"打错字了,是"同名"。
我的语言不大好~= =关于"覆盖用名"的说法我会纳用。
而"外界调用"的说法,我不能说出一个更好的说法= =。
(我的表达能力有待改善,上面的问题我会改善的了~)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
发表于 2011-1-9 00:08:07 | 显示全部楼层
回复 小幽的马甲 的帖子
“外界调用”实为类的实例变量调用其类中的方法

由于 Ruby 的方法分派模型和 Smalltalk 基本一致,那么按照 Smalltalk 世界里的术语和概念,严格来说就不是“实例变量”在调用,而是发送这个方法调用的消息的那个方法,通常被称为调用者(caller)。由于 Ruby 语言核心支持的分派模式和 Smalltalk 一样是单一分派,所以进行消息方法映射时的键只有这个所谓的“实例变量”,通常被称为接收者(receiver),因为我们发送的消息由它来接收,之后会有一个分派函数,动态判断接收者类型,并通过映射找到实际应该调用的方法,最后调用。obj.method(arg1, arg2, ...) 形式的语法,翻译到面向过程的世界,其实就是 function(receiver, arg1, arg2, ...),即第一个参数是接收者,只不过在面向对象语言中有特殊的语法(大多是小圆点 `.' 前的一个符号),让并没有在参数列表中的接收者也被隐式地传给实际的方法/函数。

评分

参与人数 2星屑 +10 收起 理由
一箭烂YiJL + 8 哦~学习...
小幽的马甲 + 2 受教&gt;&lt;

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
90
在线时间
3 小时
注册时间
2008-8-21
帖子
1
发表于 2011-2-5 23:26:07 | 显示全部楼层
哟西~~~~ 很好理解~~
回复 支持 反对

使用道具 举报

Lv2.观梦者

铃铃塔的守护者

梦石
0
星屑
626
在线时间
961 小时
注册时间
2010-10-24
帖子
2768

贵宾

发表于 2011-2-5 23:36:33 | 显示全部楼层
恩,看来我之前对super的理解是无误的。
不过,记得在调用类方法的时候,是先找子类,后找父类吧。而不是定义的覆盖吧,难道说定义子类的时候父类的方法直接整个传递给了子类?

魔法麻将独立游戏制作中,欢迎热情的测试员与UI设计师合作开发~
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1224
在线时间
667 小时
注册时间
2009-11-11
帖子
2787
发表于 2011-2-7 22:35:56 | 显示全部楼层
- -看到要回复啊。。。所以只得:LZ记得下次来 model(模块)的讲解Y,可以的话。。。

点评

是module 吧,我也搞不清楚,好象这种定义数据用的模块只有RUBY有。。。。  发表于 2011-2-12 15:54
module是吧(早知不用model作为例范名字了。)  发表于 2011-2-9 15:35

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 22:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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