2012-11-03 109 views
1

attr_accessor我想限制父類的方法在子類中訪問紅寶石限制在子類中

class Parent 
    attr_accessor :first_name, :last_name 

    def initialize(first_name, last_name) 
    @first_name, @last_name = first_name, last_name 
    end 

    def full_name 
    @first_name + " " + @last_name 
    end 

end 

class Son < Parent 
    attr_accessor :first_name 

    def initialize(parent, first_name) 
    @first_name = first_name 
    @last_name = parent.last_name 
    end 

    def full_name 
    @first_name + " " + @last_name 
    end 
end 


p = Parent.new("Bharat", "Chipli") 
puts p.full_name 

s = Son.new(p, "Harry") 
s.last_name= "Smith" 
puts s.full_name 

這裏我得到兒子的全名「哈利·史密斯」,但我想「哈利Chipli」

+0

我現在可以想到的一種解決方案是重新定義'last_name ='方法,使其不會執行任何操作或拋出異常。這種行爲也可以包裝在一個mixin – pjam

回答

4

父的初始化方法:

@first_name, @last_name = [first_name, last_name] 

試試這個

和:

class Son 
    def attr_reader :last_name 

    def last_name=(name) 
    @last_name ||= name 
    end 
end 

這樣它只會定義t他姓氏,如果兒子沒有父母的名字(對孤兒有好處)。

+0

我仍然可以將姓氏設置爲孩子。我需要的是如果嘗試運行son.last_name ='something',則應該出現錯誤'姓氏必須從父'取得。兒子可以得到姓氏,但姓氏總是與父母 –

+0

一樣,那麼:def姓氏=(姓名) 提出「姓氏必須從父母身上取走」 結束 – ChuckE

0
class Son < Parent 
    attr_accessor :first_name 

    ... 

    private 

    attr_accessor :last_name 
end 

應該這樣做。

+0

謝謝,但它給我錯誤,當我訪問父母的lasat_name裏面的兒子的初始化方法「@last_name = parent.last_name」 –

+0

什麼是從兒子的實例訪問父母姓氏的最佳方式?像attr_reader:在兒子姓氏將給父母的姓氏 –

+0

我認爲你最好不要繼承使用這個問題。如果兒子進入證人保護計劃並給予新姓,會發生什麼情況? – Russell

0

您可以重新定義姓氏二傳手:

Class Son < Parent 

... 

def last_name=(name) 
end