2015-09-17 52 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