04/30/2010 对象和属性
Song对象有内部的状态(例如歌曲名称和演唱者),这些状态是对象所私有的,即其他对象无法访问一个对象的实例变量。
通常会定义一些方法来访问及操作对象的状态,让外部世界得以与之交互。一个对象的外部可见部分被称为其属性(attribute).
对Song对象来说,需要找出歌曲的名称和演唱者(这样可以在歌曲播放时显示它们),以及时长(这样可以显示某种进度条)。
C++ : 支持多继承,一个类可以有多于一个的直接父类,并继承每者的功能。
Java和C# : 支持单继承,一个类只能有一个直接的父类。
Ruby:Ruby类只有一个直接的父类,因此Ruby是一门单继承语言。
Ruby类可以从任何数量的mixin(类似于一种部分的类定义)中引入(include)功能。这提供了可控的,类似多继承的能力,而没有多继承的缺点。
定义了3个访问方法来得到这3个实例变量的值。
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
def name #访问方法,方法name()返回实例变量@name的值。
@name
end
def artist
@artist
end
def duration
@duration
end
end
song = Song.new(“LOVE”, "Nikey", 250)
song.artist -->Nikey
song.name -->LOVE
song.duration -->250
Ruby提供了一种方便的快捷方式:attr_reader可创建这些访问方法。
注:attr_reader是Ruby的一个方法,而:name等符号(Symbol)是其参数,它会通过代码求解, 动态地在Song类中加入实例方法体。
构成体 :artist 是一个表达式,它返回对应artist的一个Symbol对象,可以将 :artist看作是变量 artist的名字,而普通的artist是变量的值。
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
attr_reader :name, :artist, :duration #动态地在Song类中加入实例方法体。
end #将访问方法命名为name, artist, duration,对应的实例变量@name, @artist 和 @duration会自动被创建。
song = Song.new("LOVE","Nikey",250)
puts song.artist, song.name, song.duration
可写的属性:
有些时候,需要能够在一个对象外部设置它的属性。
在Ruby中,访问对象属性就像访问其他变量一样,例如:song.name语句。
因此,当想要设置某个属性的值时,可对这些变量直接赋值。在Ruby中,可通过创建一个名字以等号结尾的方法来达成这一目标。这些方法可以作为赋值操作的目标。
class Song
例如:假定某首歌的时长最初是预估得来的(可能从CD或MP3数据的信息中产生而来),当我们第一次播放这首歌时,会得到它实际的长度,并将这个新的值保存回Song对象中。
浙公网安备 33010602011771号