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对象中。

posted @ 2010-04-29 13:28  NikeyL  阅读(211)  评论(0)    收藏  举报