类的基本知识:


    1.类的定义和对象的初始化

点击(此处)折叠或打开

  1. class Song
  2.   def initialize(name,artist,duration)
  3.   @name=name
  4.   @artist=artist
  5.   @duration=duration
  6.  end
  7. end
initialize是类中的特殊的方法,用于在新建对象时传递参数初始化,类似于C++中的构造函数。
@开头的变量称为实例变量,对象中的所有方法均可访问实例对象。


点击(此处)折叠或打开

  1. song1=Song.new("Need you now","Carlz",300)
  2. song1.inspect ->"#"
使用new方法来实例化,与PHP相同;
inspect方法可以对象的ID号和实例变量打印出来;
还有另一种更好的格式化输出方法:to_s (类似于PHP中打印的to_string方法),但是默认的to_s方法只会返回对象的ID号,需要对它进行重写:

点击(此处)折叠或打开

  1. class Song
  2.    def to_s
  3.    "Song:#@name--#@artist (#@duration)"
  4.    end
  5. end
此时的输出为:

点击(此处)折叠或打开

  1. song1.to_s -> "Song:Need you now--Carlz (300)"
类不是封闭的,可以直接往类中增加方法或者对原来的方法进行重写。


    2.类的继承属性


点击(此处)折叠或打开

  1. class KaraokeSong < Song
  2.   def initialize(name,artist,duration,lyrics)
  3.    super(name,artist,duration)
  4.    @lyrics=lyrics
  5.   end
  6. end
    定义子类时,"<"表示前者是后者的子类;
  super关键字表明子类从超类(父类)中继承了相应的实例变量;
   Ruby解释器检查对象方法调用时,先看该类中是否有该方法。否则,会去超类中找同名的方法,然后是超超类,依次追溯整个祖先链;


点击(此处)折叠或打开

  1. song2=KaraokeSong.new("My Way","Sinatra",225,"And now, the...")
  2. song2.to_s -> "Song:My Way--Sinatra (225)"
此时使用to_s,并没有lyrics的信息,因为调用的是父类中的to_s方法。可以通过重写to_s,利用好super关键字

点击(此处)折叠或打开

  1. class KaraokeSong < Song
  2.   def to_s
  3.    super + {#@lyrics}
  4.   end
  5. end

    song2.to_s -> "Song:My Way--Sinatra (225) {And now, the...}"
super会调用父类Song中与子类to_s同名方法,这很好的解决了父类与子类之间的耦合问题

对象和属性

可以通过attr_reader直接读取对象中实例变量,其原理是在类中动态的加入实例方法体,能够直接调用得到属性值

点击(此处)折叠或打开

  1. class Song
  2.   def initialize(name,artist,duration)
  3.    @na=name
  4.    @art=artist
  5.    @dur=duration
  6.   end
  7.  attr_reader :na, :art, :dur
  8. end

  9. song1=Song.new("Need you now","Carlz",300)
  10. song1.dur -> 300
  11. song1.art -> Carlz
  12. song1.na -> Need you now
attr_reader :na, :art, :dur 会在类中生成方法名依次为"na,art,dur"的方法,这些方法会返回相应实例变量的属性值





09-04 12:58