標籤:
第二章
類繼承,屬性,類變數
1.如何聲明一個子類
class Treasure < Thing
這樣Thing類中的屬性name,description都被Treasure繼承
2.以下三種方式傳入父類initialize方法的參數分別是什嗎?
# This passes a, b, c to the superclassdef initialize( a, b, c, d, e, f ) super( a, b, c )end# This passes a, b, c to the superclassdef initialize( a, b, c ) superend# This passes no arguments to the superclassdef initialize( a, b, c) super()end
第一種把參數中a,b,c傳入父類initialize方法;第二種傳入全部參數,但不加上括弧;第三種不傳入參數
3.屬性的setter/getter
有人這樣寫setter/getter:
puts( t1.get_description )
t1.set_description( “Some description” )
這樣似乎更方便一些:
puts( t1.description ) t1.description = “Some description”
如果你想用第二種寫法,你不得不這麼寫:
def description return @description end def description=( aDescription ) @description = aDescription end
註:這是正確的:def name=(aName)
但這卻是錯的:def name =(aName)
你看出差別的了嗎?
根據上一章,你可以知道,這裡定義了兩個方法:description方法和description=方法。原來是通過將"="加入方法名實現的,ruby真是神奇,Java就不能這樣寫。
然而,事實上有更簡單的方法來實現setter/getter
attr_reader :description attr_writer :description
由一個attr_reader/attr_writer加上符號(:description)構成,事實上,可以一次為多個元素設定setter/getter
attr_writer(:name, :description)
attr_accessor(:value, :id, :owner)
attr_accessor
等價於:
attr_reader :value
attr_writer :value
4.super
和Java不一樣,Ruby中的super方法可以出現在任何方法中,而不只是initialize(構造方法)中。
在第2點中就對super方法的使用有介紹,單獨的super將所有參數傳給父類initialize,而帶參數的super則將指定參數傳給父類initialize。
# This passes aName, aDescription to the superclassdef initialize( aName,aDescription ) super( aName, aDescription )end# This passes a, b, c to the superclass‘s aMethoddef aMethod( a, b, c ) superend
5.常量和嵌套類(constants & nested class)
class X A = 10 class Y def xyz puts( "goodbye" ) end end def self.abc puts("hello") endend
常量:以大寫字母開頭的變數。
如果要訪問常量或內部類,需用 ::
puts( X::A )X::abc # 你也可以用::來調用方法X.abc # 當然這樣也可以ob = X::Y.newob.xyz
6.部分類(Partial Class)
在Ruby中可以對現存的類進行修改,並影響已經產生的對象
class A def a puts ‘a‘ endenda = A.newa.public_methods(false)//列印A class所有public的方法# => [:a] //只有aclass A def b puts ‘b‘ endenda.public_methods(false)# => [:a, :b]//有a和b
而不能修改的,是類繼承了哪個類。比如
class A def a puts ‘a‘ endendclass A < String def c puts ‘c‘ endend
# TypeError: superclass mismatch for class A
# 所有類預設繼承了Object類,A也繼承了Object,所以當你讓A繼承String時就會報錯
Ruby學習-第二章