classUser defup_vote(friend) bump_karma friend.bump_karma end protected defbump_karma puts "karma up for #{name}" end end
INHERITANCE
重複的程式碼使用繼承來避免。 原來程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13
classImage attr_accessor:title, :size, :url defto_s "#{@title},{@size}" end end
classVideo attr_accessor:title, :size, :url defto_s "{@title}, {@size}" end end
使用繼承後:
1 2 3 4 5 6 7 8 9
classAttachment attr_accessor:title, :size, :url defto_s "#{@title}, #{@size}" endend classImage < Attachment end classVideo < Attachment end
ruby內的繼承就用箭頭<來表示
SUPER
ruby的super跟java的super只能夠繼承constructor一樣。(見下圖)
super的省略寫法
super不僅可以在method裡面用,而且有省略寫法。 不過一開始學習還是把參數加上去避免混淆。
overideing methods以加強執行效率
原來寫法:使用case來判斷。
1 2 3 4 5 6 7 8 9 10
classAttachment defpreview case@type when:jpg, :png, :gif thumbnail when:mp3 player end end end
不如直接使用subclass,增加效率。
1 2 3 4 5 6 7 8 9 10 11
classAttachment defpreview thumbnail end end
classAudio < Attachment defpreview player end end
HIDE INSTANCE VARIABLES
這節要討論的是如何簡化程式碼 原本
1 2 3 4 5 6 7 8
classUser deftweet_header [@first_name, @last_name].join(' ') end defprofile [@first_name, @last_name].join(' ') + @description end end
可以看到method內有重複的地方。把他們包起來獨立出來。
1 2 3 4 5 6 7 8 9 10 11
classUser defdisplay_name [@first_name, @last_name].join(' ') end deftweet_header display_name end defprofile display_name + @description end end
更漂亮的寫法?
1 2 3 4 5 6 7 8 9 10 11
classUser defdisplay_name title = case@gender when:female married? ? "Mrs." : "Miss" when:male "Mr." end [title, @first_name, @last_name].join(' ') end end