Ruby 中类的几个概念

上一篇 / 下一篇  2008-12-07 17:46:00 / 个人分类:Ruby

  1. 类的继承和消息
继承允许创建一个新的类,作为另一个类的精炼和特化。 用符号<来表示继承
如:有这么一个超类:
-----------------------------------------------------------------
class Song
  def initialize(name,artist,duration)
    @name = name
    @artist = artist
    @duration = duration   
  end
  def to_s
    "Song: #{@name} #{@artist}(#{@duration})"
  end
end
----------------------------------------------------------------
现在要定义一人卡拉OK的子类,来加上歌词,那么可以这样定义:
-----------------------------------------------------------------
class KaraokSong < Song
  def initialize(name,artist,duration,lyrics)
    super(name,artist,duration)
    @lyrics = lyrics
  end
 
  def to_s
    puts super + "#@lyrics"
  end
end
---------------------------------------------------------------------
puts song.inspect
puts song.to_s
--------------------------------------------------------------------
执行结果为:
#<KaraokSong:0x1021f34 @artist="wqs", @lyrics="my wqs", @duration=4, @name="ldh">
Song: ldh wqs(4)my wqs
---------------------------------------------------------------------
子类和超类的消息传递过程为:
当调用song.to_s时,并不知道从何处找到to_s方法,而是将判定推迟到程序开始运行时再进行。在那时,Ruby查看song所属的类。如果该类实现了和消息名称相同的方法,就运行这个方法,否则,Ruby就查看其父类的方法 ,然后是祖父,如果在其所有祖先类中没有找到合适的方法,会引发一个错误。
当类中没有指定父类时,默认以Object类作为父类。
2. 对象和属性

类的对象是有状态的,这些状态是对象私有的,其它对象无法访问一个对象的实例变量,当外部世界需要与之交互时,怎么办呢,对于java语言来说,可以定义一些方法来操作对象的状态,如:
class song
   def name
    @name
  end
  def artist
    @artist
  end
end
定义name方法来返回name
Ruby中提供了一种非常简单的方法,如:
class song
    attr_reader :name,:artist
end
这里可以将:name看作是变量name的名字,而普通的name是变量的值,在这个例子中,将访问方法命名为name,artist对应实例变量@name,@artist会被自动创建。

可写的属性可以用attr_writer :name,:artist,如:
class song
    attr_writer :name,:artist
end
虚拟属性这类属性访问的方法并不必须是对象实例变量的简单包装

class Song
  def duration_in_minutes
    @duration/60.0   # force floating point
  end
  def duration_in_minutes(value)
    @duration = (value*60).to_i
  end
end

这里我们使用属性方法创建了一个虚拟的实例变量。对外部世界来说,duration_in_minutes就象其它属性一样,然而在内部没有对应的实例变量。



TAG: Ruby

 

评分:0

我来说两句

Open Toolbar