繼續學習,主要學習下面幾點:
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”。