我玩弄了繼承,試圖從子類的基類中擴展一個方法。多態性。基本上,我試圖用一個附加選項擴展基本方法(狀態)。擴展BaseClass方法(多態)
但是,由於某種原因它不能按預期工作。我認爲B.new.status(1)會返回2而不是零。
如果我在「y if opt == 2」之後放置超級,那麼結果是反之。
這是爲什麼,我該如何解決這個問題?
非常感謝提前!
class A
attr_reader :x
def initialize
@x = 2
end
def status(opt)
x if opt == 1
end
end
class B < A
attr_reader :y
def initialize
super
@y = 10
end
def status(opt)
super
y if opt == 2
end
end
B.new.status(1)
=> nil
B.new.status(2)
=> 2
從設計角度來看,最好是對子類強制執行,以便首先調用基類函數。這可以通過模板方法模式輕鬆實現。 – Jens
好點。你的意思是,我應該從A類中的狀態方法中清除代碼,並將其置於B類的狀態方法中。因此,B類的狀態方法將具有:「x if opt == 1」和「y if opt = = 2「。而且,我不再需要在狀態方法中調用super,對吧? – user3572412
不,我的意思是A.status完成所有類型通用的工作,然後調用子類覆蓋的(抽象)方法。這樣,每個子類都實現了子類特定的功能,並且基類實現了一勞永逸的協議。這是模板方法設計模式:https://en.wikipedia.org/wiki/Template_method_pattern – Jens