继续学习,主要学习下面几点:
1:继承
2:属性
在面向对象的世界里,总少不了继承的概念,在上次提到的例子里,我们重写了to_s的属性,既然涉及到重写就说明这个to_s本身就存在这个消息,其实我们新建的任何一个类,如果我们没有明确指定他继承于谁,那么他默认是继承自Object类。在Ruby中Ruby和多数面向对象语言,是只支持继承一个类的,但Ruby通过另外一种方式实现了多重继承的效果,这个暂时不表,因为我也不清楚到底是啥,以后学到了再详述。
下面我们先看一下Ruby继承的写法。。。
- class KaraokeSong < Song
- def initialize(name , artist , duration , lyrics)
- super(name , artist , duration)
- @lyrics = lyrics
- end
- def to_s #继承并重写属于自己的to_s
- super + " [#@lyrics]"
- end
- end
Ruby 用 “<” 来表示继承自xxxx , 而类似于Java的,Ruby也使用super来调用父类的方法。像以上,我们可以看到有两处都用到了super关键字,在to_s中,super没带任何参数表示父类方法中同样名的方法。
在以上讲述了类和他相关的方法后,我们将目光转移到类中的对象,不如实例变量。
实例变量是类私有的,他不能被外界访问和赋值,就像java或是C#中的private 修饰的字段一样的,在java中我们使用get/set方法来访问,而在C#中提供了属性来提供外界的交互。在Ruby中,也同样可以用类似于java的get/set方法来提供对外界访问的方法,比如:
- def name
- @name
- end
- def artist
- @artist
- end
- def name = (new_name)
- @name = new_name
- end
- def artist = (new_artist)
- @artist = new_artist
- end
就像以上一样,但这样和普通的方法一样,显示不出来有什么Ruby的简单和高效,Ruby提供了另外两种访问符:【attr_reader , attr_writer】,这两个访问符使得实例变量的对外访问更加的方便快捷,下面我们看看她们的用法:
- class Song
- attr_reader :name , :artist , :duration
- attr_writer :name , :artist , :duration
- end
- song = Song.new("You're beautiful" , "James blunt" , 215)
- puts song.name #读
- song.name = "You're beautiful,it's true" #写
- puts song.name
另外这些除了读属性和写属性外,另外Ruby还有一种叫做虚属性(Virtual Attributes) ,下面我们来看看:
- class Song
- def duration_in_minutes
- @duration/60.0 # force floating point
- end
- def duration_in_minutes=(new_duration)
- @duration = (new_duration*60).to_i
- end
- end
- song = Song.new("Bicylops", "Fleck", 260)
- song.duration_in_minutes #4.33333333333333
- song.duration_in_minutes = 4.2
- song.duration #252
从外面看,似乎和别的属性并没有什么多大的区别。但他在内部使用了计算变量,而不是原来的实例变量,这被称为“统一访问原则”,我们在以后的学习过程中,再继续关注这一“big win”。