Project1

标题: 新手教程——super的作用和外界调用类中函数_(8) [打印本页]

作者: 一箭烂YiJL    时间: 2011-1-8 15:28
标题: 新手教程——super的作用和外界调用类中函数_(8)
本帖最后由 一箭烂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里任何一个建立新函数。


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


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

作者: 不是马甲    时间: 2011-1-8 16:02
本帖最后由 不是马甲 于 2011-1-8 16:03 编辑

沙发 ?  表示很好 希望楼主继续加油
作者: discain    时间: 2011-1-8 20:26
最终依次输出:
01."B类"
02."A类"
03."B类"
04."C类"
-------------------------------
这个好像是错误的,怎么看输出的都应该是
"A类"
"B类"
"C类"

作者: 小幽的马甲    时间: 2011-1-8 20:44
看完的来回贴,附带bug一只:“这样就知道了:super会调用父类的用名函数。”
”外界调用类中函数““调用函数是找最近的“这种说法感觉有些不妥,“外界调用”实为类的实例变量调用其类中的方法,要说”外界调用类中函数“感觉更像调用类方法(class <<A这样);“调用函数是找最近的“应该说是”最近(靠后定义)的方法会覆盖之前的同名方法“比较好{:nm_3:}
作者: Rion幻音    时间: 2011-1-8 21:55
一箭兄哪会没名望呢~发布区的教程部分都是箭兄的呢~{:nm_5:}
作者: 一箭烂YiJL    时间: 2011-1-8 22:49
回复 小幽的马甲 的帖子

嗯,我的"用名"打错字了,是"同名"。
我的语言不大好~= =关于"覆盖用名"的说法我会纳用。
而"外界调用"的说法,我不能说出一个更好的说法= =。
(我的表达能力有待改善,上面的问题我会改善的了~)
作者: 苏小脉    时间: 2011-1-9 00:08
回复 小幽的马甲 的帖子
“外界调用”实为类的实例变量调用其类中的方法

由于 Ruby 的方法分派模型和 Smalltalk 基本一致,那么按照 Smalltalk 世界里的术语和概念,严格来说就不是“实例变量”在调用,而是发送这个方法调用的消息的那个方法,通常被称为调用者(caller)。由于 Ruby 语言核心支持的分派模式和 Smalltalk 一样是单一分派,所以进行消息方法映射时的键只有这个所谓的“实例变量”,通常被称为接收者(receiver),因为我们发送的消息由它来接收,之后会有一个分派函数,动态判断接收者类型,并通过映射找到实际应该调用的方法,最后调用。obj.method(arg1, arg2, ...) 形式的语法,翻译到面向过程的世界,其实就是 function(receiver, arg1, arg2, ...),即第一个参数是接收者,只不过在面向对象语言中有特殊的语法(大多是小圆点 `.' 前的一个符号),让并没有在参数列表中的接收者也被隐式地传给实际的方法/函数。
作者: sedjamm    时间: 2011-2-5 23:26
哟西~~~~ 很好理解~~
作者: px.凤翔九天    时间: 2011-2-5 23:36
恩,看来我之前对super的理解是无误的。
不过,记得在调用类方法的时候,是先找子类,后找父类吧。而不是定义的覆盖吧,难道说定义子类的时候父类的方法直接整个传递给了子类?
作者: summer92    时间: 2011-2-7 22:35
- -看到要回复啊。。。所以只得:LZ记得下次来 model(模块)的讲解Y,可以的话。。。
作者: 沉影不器    时间: 2011-2-12 21:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 一箭烂YiJL    时间: 2011-2-12 22:53
本帖最后由 一箭烂YiJL 于 2011-2-12 23:16 编辑

回复 沉影不器 的帖子

我指的是前几课,你(可以叫您或者前辈吗?(我实是晚辈))可以可以跟着帖子里的这个标志:前一课:
去寻找有联系的前几课。或者:http://rpg.blue/space-uid-115768.html
访问我的空间看带"新手教程——"前覆的帖子。
作者: ClaudeBell    时间: 2011-2-13 14:30
非常不错的教程,简单易懂,就是有些术语和常见的不太一样,看着不太习惯= =!
期待后续教程。{:nm_4:}
作者: zenkl    时间: 2011-2-24 10:47
1.
class B
  def b
    p "B类"
  end
end

class A < B
    super        
    super
    def b
    p "A类"
  end
end

@a = A.new
@a.b       #=>"B类"  "B类"  "A类"   
               #=>"A类"
答案应该是哪个?
2.C
Class C<Window_Base
   def Draw_VX
    super
    text="vx教程出版社"
    self.contents.draw_text(x,y,w,h,text,1)
    end
end
个人搞不清类和函数的区别。。

作者: 一箭烂YiJL    时间: 2011-2-24 18:23
回复 zenkl 的帖子

1.super不在函数(方法function)里会出错,
如果在def b里的话输出"B类"  "B类"  "A类" 。这就是super的作用。
如果没有了那两个super就会"A类",由于覆盖了的原因。


2.如果搞不清楚类和函数的话可以这样解释:
类是一个无名的东东(就是一个类别),比如人类(要取名),而人类继承的当然是动物,
类必须给名字,例在地球的场景里写:
class Person
#空的,哈哈哈
end
# ............到了地球的场景............
zenkl = Person.new       # 然后就有个人在地球上叫zenkl
然后就是要zenkl做出一些动作了。
函数就是方法,方法就像动作。那么比如:
class Person
  def tell_a   # 这个动作是说出"a"这个字眼
    p "a"
  end
end
# ............到了地球的场景............
zenkl = Person.new       # 地球上有个人叫zenkl
zenkl.tell_a                     # 是个说出"a"的动作,窗口输出=>"a"
作者: wangswz    时间: 2011-4-23 12:53
本帖最后由 wangswz 于 2011-4-23 12:53 编辑

。。。06年的再次来学习10年的帖子 。。
所以 名望? 那个怎么吃?
作者: 逸豫    时间: 2011-7-17 11:04
  1. class A
  2. def a
  3. p "a"
  4. end
  5. end
  6. module B
  7. def a
  8. super
  9. p "b"
  10. end
  11. end
  12. class C < A
  13. include B
  14. def a
  15. super
  16. p "c"
  17. end
  18. end
  19. C.new.a
复制代码
LZ确定不需要介绍下这个的用法么……
感谢紫苏倾情提供讲解……
作者: 退屈£无聊    时间: 2011-7-18 19:02
其实我表示super 和 super()的区别才是王道=-=(卖萌状
作者: 思考_William    时间: 2011-8-15 23:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 受pia专用ID    时间: 2011-8-24 11:43
class A
  def aa
    ab
  end
  def ab
    p "ab"
  end
end
class B < A
  def aa
    super
  end
  def ab
    p "bb"
  end
end
xxx = B.new
xxx.aa #输入这段脚本会显示“bb”
=begin
通过实验,我得出:在子类中用super调用的父类中同名的方法如果还调用了方法,则会先在子类中找,若子类中有,则父类中同名的方法会被忽略
作者: 八宝粥先生    时间: 2012-1-19 11:50
太难了,看不懂。继续做伸手党....




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