2015-09-17 82 views
0

我玩弄了繼承,試圖從子類的基類中擴展一個方法。多態性。基本上,我試圖用一個附加選項擴展基本方法(狀態)。擴展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 
+0

從設計角度來看,最好是對子類強制執行,以便首先調用基類函數。這可以通過模板方法模式輕鬆實現。 – Jens

+0

好點。你的意思是,我應該從A類中的狀態方法中清除代碼,並將其置於B類的狀態方法中。因此,B類的狀態方法將具有:「x if opt == 1」和「y if opt = = 2「。而且,我不再需要在狀態方法中調用super,對吧? – user3572412

+0

不,我的意思是A.status完成所有類型通用的工作,然後調用子類覆蓋的(抽象)方法。這樣,每個子類都實現了子類特定的功能,並且基類實現了一勞永逸的協議。這是模板方法設計模式:https://en.wikipedia.org/wiki/Template_method_pattern – Jens

回答

0

這是因爲從A返回值s statusstatusB使用「。是的,在A的狀態下,'x'將被退回,但在Bstatus中未使用。

自動返回方法中最後一條語句的結果,但super不是Bstatus中的最後一條語句。

0

如果不滿足if語句的編碼,則返回nil。所以,你應該做這樣的事情:

if opt == 2 
    y 
else 
    super 
end 
+0

或'opt == 2? y:super' – jphager2