第三章类、对象和变量
类定义:
- class Song
- def initialize(name,artist,duration)
- @name=name
- @artist=artist
- @duration=duration
- end
- end
当使用Song.new创建一个Song的对象时,首先分配一些内存来保存为初始化的对象,然后调用对象的initialize方法,并把调用new 时所使用的参数传入该方法
继承自Object的方法:
inspect:默认将对象的ID和实例变量格式化。
to_s:Ruby标准消息,返回对象的字符串表示,默认为对象的ID
为类添加新特性:在Ruby中类不是封闭的,可以向一个已有的类中添加方法,当为类添加新方法时,只需打开类的定义,添加新方法,原有的方法依然存在。
例如要在Song类中重写to_s方法,只需向Song中添加一个to_s方法,而不必重写原来的类。
- class Song
- def to_s
- "Song: #@name--#@artist (#@duration)"
- end
- end
这时Song就重写了to_s方法,而原有的方法都不变。
继承
通过关键字"小于号"实现继承
super关键字:在方法中使用super而不使用参数时,Ruby向当前对象的父类发送一个消息,要求调用父类中的同名方法。
属性
一个对象的外部状态叫做属性,就是访问和操作对象的状态的方法。
访问对象状态,类似于Java的getter方法,操作对象状态,类似于Java的setter方法。
- class Song
- #访问属性的方法,类似于Java中的getter
- def name
- @name
- end
- def artist
- @artist
- end
- def duration
- @duration
- end
- #设置属性值的方法,类似于Java中的setter
- def name=(new_name)
- @name=new_name
- end
- def artist=(new_artist)
- @artist=new_artist
- end
- def duration=(new_duration)
- @duration=new_duration
- end
- end
此外,Rubby提供了一种方便的快捷方式:
- class Song
- attr_reader :name, :artist, :duration
- attr_writer :name, :artist, :duration
- end
类变量和类方法
类变量被类的所有对象所共享,相当于Java的static变量,类变量由两个@开头,在使用之前必需被初始化。
- class Song
- @@plays=0
- def play
- @@plays+=1
- end
- def Song.closeall
- @@plays=0
- end
- end
@@plays是Song类的一个类变量,每创建一个Song对象并调用play方法时,@@plays加一,@@plays依赖于Song类,而不是Song的对象。
类方法相当于Java中的static方法,它被类所使用。类方法的定义通过在方法名之前放置一个类名和句点来定义
Singleton
- class MyLogger
- private:new
- @@logger=nil
- def MyLogger.create
- @@logger=new unless @@logger
- @@logger
- end
- end