跟我一起学ruby——第二天
* 注:本教程在http://www.diyrpg.com/上发表,授权给幻想森林论坛使用。版权属于作者Tiger。其他人转载需要注明出处。
第一章——类,对象和方法
--------------------------------------------------------------------------
基础知识
既然说Ruby是一种纯粹的面向对象编程的脚本语言,那么我就从对象开始学起。
一、对象是什么?
游戏中的任何东西都可以被可以解释为对象。
钱的数目是对象,村长是对象,流氓甲也是象。因为Ruby所能处理的值都是对象,为了方便对象的操作就引进了类的概念。
二、类是什么?
对象的种类就称为类。
村长和流氓甲属于NPC类,钱的数目属于自然数类(注:这里所说的类你可以自己定,你也可以说村长和流氓甲属于人类:属于哺乳类:属于...)
一些特殊的属于这个类的对象叫作类的实体(或实例)。
在日常生活中,我们对一切对象的分类都是有一定层次的。
我们知道:生物〉动物〉哺乳类〉人类
村长和流氓甲属于人类,它就一定有哺乳类的属性,也就一定有动物的属性。我们称生物是动物的父类,动物是生物子类,不难发现子类会继承父类的属性。当然也会遇到这样的情况:父类的某些属性不可以被某一特定的子类继承——虽然一般鸟类都会飞,但企鹅是鸟类中不会飞的一个子类。
得到自然界这种规律的启发,Ruby就引进了继承。它大大减少了程序员的工作量,我们只需要定义一个父类(或叫做超类)的属性,它的子类就会自动继承它父类的属性。当然当你遇到像上文提及的那个企鹅特例还要新增或重定义子类和父类之间的区别。继承的意思,就是保持被继承者的性质但却同时拥有自己独有的特性。
引进了类只是方便对象的操作,那么究竟怎么操作对象呢?那就要用方法了。
三、方法什么?
方法是某个类中所有的对象专用的命令。
你只需在某个对象上调用某个方法就可以让这个对象施行这个方法所代表的方法。而这个被操作的对象称为“作用实例”或是“方法的参数”。
比如说你养了许多狗,(狗是一个类,被你养的狗是它的子类)有一个叫旺财(旺财是对象,也是实例),你每天训练他们坐下(这是在定义一个方法),之后每当你发号坐下这个命令时(这是在调用坐下这个方法)被你养的狗就会坐下。(你就通过方法完成了对对象的操作)。假如被你养的狗还分狼狗和哈巴狗二类,(狼狗和哈巴狗是被你养的狗的子类),它们会继承它父类中定义过的方法。当然一个类中可以定义许多方法(你可以教狗许多东西)。
又比如说把Ruby看作CD机,CD机所操作的一切东西——CD就是所有的对象,类是歌曲的风格(如R&M是一类,Rap是另一类);当然你也可以把歌手当类的分法(如周杰伦是一类,陈奕迅是另一类),而调用方法就是按播放按钮,停止按钮,暂停按钮等。
--------------------------------------------------------------------------
实践基础
在Ruby中创造一个对象并对其进行操作的步骤如下:
首先得定义类的属性——
一、类的定义
格式:
class 类名
类中定义的内容
end
注意:类名必须以大写字母开头。
如果是一个子类就这样写:
class 子类名< 父类名
类中定义的内容
end
或在定义后面直接写上:
class 子类名 < 父类名
end
这只是让父类继承父类,不是重定义。为什么这么说呢?
光有一个类还不行,接着再往里面塞方法,以便以后对对象的操作。
二、方法的定义
方法的定义写在“类中定义的内容”那里
格式:
def
方法中定义的内容
end
注意:方法必须以小写字母开头。
当然当你遇到像上文提及的那个企鹅特别的子类时,你还要重定义子类和父类之间的区别这叫称为重载,格式同上。方法的调用如反复定义,则以最后一次为准。
在子类方法中调用父类相同方法的情况下,要使用关键词 super。super将调用被当前方法覆盖的父类中的同名方法。
格式:
super(定义的内容, ... )
若省略括号和参数时,将会把当前方法的参数原封不动地传递给父类中的同名方法。若调用时不想使用参数的话,请使用括号显式地标出,像super()这样。
最后创造一个属于这个类的对象(实例)——
三、实例的创造
格式:
实例名 =类名.new
实例终于创造好了,现在就该对它进行操作了。
四、方法的调用
在ruby里,我们通过点 . 来调用一个对象的方法
格式:
已创造的实例名.方法名
如果你要创造一只临时存在的实例,并给其加上方法:
(类名.new).方法名
或:
类名.new.方法名
--------------------------------------------------------------------------
Type&Run
一(首格的数字别打!)
1 class NPC
2 def intro
3 print "我是NPC?"
4 end
5 end
6
7 class Lioumang<NPC
8 def talk
9 print "XX在村子的南方"
10 end
11 end
12
13 流氓甲=Lioumang.new
14 流氓甲.talk #显示 我是NPC?
15 流氓甲.intro #因为流氓甲继承了它的父类的方法,所以显示 XX在村子的南方
说明:
1~5定义一个类——NPC
5~11定义一个NPC的子类——Lioumang
2~4为NPC定义一个名叫intro的方法,print " "的做用是显示“”内的东西。(先不要管它怎么运作的)
8~10为Lioumang定义一个名叫talk的方法
13创造实例——流氓甲
14为流氓甲调用talk的方法
15为流氓甲调用intro的方法
二
1 class NPC
2 def intro
3 print "aaa"
4 end
5 end
6
7 class Lioumang<NPC
8 def intro
9 print "bbb"
10 end
11 end
12
13 流氓甲=Lioumang.new
14 流氓甲.intro
说明:
显示的是bbb,可见方法的调用如反复定义,则以最后一次为准。但如果13行变为 流氓甲=NPC.new 则显示aaa
三
1 class NPC
2 def intro
3 print "aaa"
4 end
5 def talk
6 print "ccc"
7 end
8 end
9
10 class NPC
11 def intro
12 print "bbb"
13 end
14 end
15
16 流氓甲=NPC.new
17 流氓甲.intro
18 流氓甲.talk
说明:
先显示的是bbb,再显示ccc,可见类如反复定义,则以保留他们交集的补集,他们的交集以最后一次为准。但如果13行变为 流氓甲=NPC.new 则显示aaa。
四
1 class NPC
2 def talk(a=nil) #nil为空集
3 p a
4 end
5 end
6
7 class Lioumang < NPC
8 def talk(a)
9 super(5) # 以5作为参数进行调用
10 super(a) # 以5作为参数进行调用
11 super # 以5作为参数进行调用,super(a)的简写
12 a = 1
13 super # 以1作为参数进行调用,super(a)的简写
14 super() # 无参数的调用
15 end
16 end
17 Lioumang.new.talk 5
说明:
2~4方法的作用是显示变量a,而a=nil,既显示nil
可见:若省略Super的括号和参数时,将会把当前方法的参数原封不动地传递给父类中的同名方法。若调用时不想使用参数的话,请使用括号显式地标出,像super()这样。
------------------------------------------------------------------------------------------------------------------------
总结
------------------------------------------------------------------------------------------------------------------------
作业
究竟什么才是"面向对象"?
---------------------------------------------------------------------------
参考答案
略
[此贴子已经被作者于2005-8-17 17:19:05编辑过] |