Ruby 扩展基类方法(多态性)
我处理了继承问题,并尝试从基类到子类扩展一个方法。多态性。基本上,我尝试用一个附加选项扩展基本方法(status) 然而,由于某些原因,它并没有像预期的那样工作。我以为B.new.status(1)将返回2而不是零 如果我把super放在“y If opt==2”之后,那么结果是相反的 为什么会这样?我如何解决这个问题 非常感谢Ruby 扩展基类方法(多态性),ruby,oop,polymorphism,Ruby,Oop,Polymorphism,我处理了继承问题,并尝试从基类到子类扩展一个方法。多态性。基本上,我尝试用一个附加选项扩展基本方法(status) 然而,由于某些原因,它并没有像预期的那样工作。我以为B.new.status(1)将返回2而不是零 如果我把super放在“y If opt==2”之后,那么结果是相反的 为什么会这样?我如何解决这个问题 非常感谢 class A attr_reader :x def initialize @x = 2 end
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
A类
属性读取器:x
def初始化
@x=2
结束
def状态(opt)
如果opt==1,则为x
结束
结束
B类零
B.新地位(2)
=> 2
如果If语句的编码不满足,则返回nil。所以你应该这样做:
if opt == 2
y
else
super
end
这是因为
A
的状态的返回值未在B
的状态中使用。是的,在A
的状态中,将返回'x'
,但在B
的状态中不使用
方法中最后一条语句的结果是自动返回的,但是super
不是B
的状态中的最后一条语句
或opt==2?y:super
从设计的角度来看,最好对先调用基类函数的子类强制执行。这可以通过模板方法模式轻松实现。很好。您的意思是,我应该从类A中的status方法中删除代码,并将其放入类B的status方法中。因此,类B的status方法将具有:“x if opt==1”和“y if opt==2”。此外,我不再需要在status方法中调用super了,对吗?不,我的意思是A.status执行所有类型的通用工作,然后调用子类重写的(抽象)方法。这样,每个子类只实现子类特定的功能,而基类一劳永逸地实现协议。这是模板方法设计模式: