我玩弄了继承,试图从子类的基类中扩展一个方法。多态性。基本上,我试图用一个附加选项扩展基本方法(状态)。扩展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