今天原本平穩的心情被一些事情所觸動,深埋的東西被拔起的感覺總是痛痛的,不提太多了,還是專心寫文章吧。說說今天這篇文章的關鍵字,看看有沒有你能有用的: Class Hierarchies ,Accessors,Attributes,Class Variables。說白了今天就是Deep in Ruby Class了,不過這個 Deep 不夠 Deep,只是在我個人的膚淺之上的Deep。
仔細說說,看完了Ruby的文法書,發現了ruby居然沒有提供介面這個文法,而是用一個Module來取代了,這也就是說Ruby沒有實現多繼承,也就是只能有一個父類,然後可以有多個子類。Only one SuperClass and many Subclass。下面看看Ruby類面類繼承的文法:
class Man def initialize(aName,aAge) @name=aName @age=aAge end def get_name return @name end def get_age return @age end def to_s return 'Good!!!' endendclass SuperMan<Man def initialize(aName,aAge,aPower) super(aName,aAge) @power=aPower end def get_power return @power end def set_power return @power endendsupermanABC=SuperMan.new('Jesse',21,100)puts (supermanABC.get_power)puts(supermanABC.inspect)
這個裡面我們可以看到從類繼承的文法就是一個<符號,很簡潔。看了代碼總是很清晰,只需要點一下就是那個super()訪問超類,也就是subclass 調用superclass的建構函式了。
我們在寫ruby的class的屬性的時候如果總是寫get_power和set_power這樣的函數,對這個屬性操作的時候還都是要class.get_power之類感覺很麻煩,我們能不能把它整成直接這樣訪問 class.power=x,那樣不是很爽啊。下面看看代碼,瞭解一下ruby的accessor方法:
class SuperMan<Man def initialize(aName,aAge,aPower) super(aName,aAge) @power=aPower end def power return @power end def power=(aPower) @power=aPower endendsupermanABC=SuperMan.new('Jesse',21,100)supermanABC.power=98puts (supermanABC.power)puts(supermanABC.inspect)
改造了一下上面的SuperMan類,然後定義了power的accessor,很明顯文法,不用抽出來講了。不過感覺對於每個屬性如果還是這樣寫的話也是比較麻煩,繼續簡化,整出下一個主角 Attribute Reader和Writer標籤。看看下面的代碼:
class SuperMan<Man attr_reader:power attr_writer:power def initialize(aName,aAge,aPower) super(aName,aAge) @power=aPower endend
更加簡化了吧,其實還可以更加簡化,繼續給出代碼:
class SuperMan<Man attr_accessor:power def initialize(aName,aAge,aPower) super(aName,aAge) @power=aPower endend
一個標籤就搞定了,其實個人比較推薦上面的attr_reader和attr_writer,因為你可以用def power這種方法的從在方便的對屬性進行處理後在返回,看看下面的代碼你就有所體會了:
class Man attr_writer:name def initialize(aName,aAge) @name=aName @age=aAge end def name return @name.capitalize endendsuperman=Man.new("jesse",21)puts(superman.name)
這裡的@name.capitalize是把這個屬性值的首字母大寫了輸出。感覺這樣更靈活一些,在靈活和方便的找到了一個折中。下面來說說Class Variables,這個是在所有的類的執行個體之間共用的一個變數。下面看看代碼:
class Man attr_writer:name @@man_name=0 def initialize(aName,aAge) @name=aName @age=aAge @@man_name+=1 end def name return @name.capitalize end def get_man_name return @@man_name endendsuperman=Man.new("jesse",21)superman1=Man.new("jesse1",22)superman2=Man.new("jesse2",22)puts superman.get_man_nameputs superman1.get_man_nameputs superman2.get_man_name
class variables的文法為@@varname。程式運行輸出的結果都是3,這就說明他們之間是共用的。這個東西在有些地方很有用,大家多考慮考慮。
今天就寫到這裡吧。明天講講 hash 和 array 的內容。順便說一下我們宿舍的小八也戀愛了,祝福他們。呵呵,不知道怎麼搞得,心裡突然很失落。也許我的愛情觀改變了...
PS: 今天看完了《A little book of Ruby》 和 《Ruby on rails:up and running》這兩本書,大強度的英語閱讀下感覺慢慢的還是可以習慣英文閱讀的。今天做個決定,以後技術書籍只要有英文版本盡量去看英文版。