ruby - super() 调用后将范围限制为父级
问题描述
我有如下所示的内容:
class A
def foo
bar
end
def bar
puts "A"
end
end
class B < A
def foo
super
end
def bar
puts "B"
end
end
所需的输出是能够调用B.new.foo #=> "A"
. 一旦调用 super ,是否可以将范围限制为父级?这对我来说有点不对劲,所以也许这表明设计不好,但我很好奇这是否可能无论如何。
解决方案
这里的问题是B
定义了一种新bar
方法来取代A
. 如果您需要保留旧行为,则必须为此创建一个别名:
class A
def foo
original_bar
end
def bar
puts "A"
end
alias_method :original_bar, :bar
end
class B < A
def foo
super
end
def bar
puts "B"
end
end
在此处使用alias_method
保留了子类未覆盖的原始方法的“副本”。
不过,您是对的,这有点混乱。您可能想要声明bar
,private
这样它就不会那么容易被否决。
推荐阅读
- python - 打印 scipy 稀疏矩阵而不跳行
- api - 是否有标准的 API 流程图代码应该坚持?
- python - 书签功能 django/python
- sql - 在 SQL (date_trunc) 中,周数最多为数月
- javascript - Reactjs,当可滚动的div扩展时如何使滚动保持在当前位置
- pandas - Pandas,groupby 包括每行分组的行数
- python - 需要帮助在 Python 中编写 Map reduce 以计算每个国家/地区每年每个 item_type 的 avg (unit_price)
- java - 如何将elasticsearch SQL API请求的结果映射到java POJO?
- javascript - chrome tabCapture 内容脚本中的 undefiend
- python - 从最小化中排除一些参数