【发布时间】:2018-05-08 12:08:22
【问题描述】:
在下面的类继承设计中,类B继承类A,并评估其方法的参数:
class A
def method_1(arg)
puts "Using method_1 with argument value '#{arg}'"
end
def method_2(arg)
method_1(arg)
end
end
class B < A
def method_1()
super("foo")
end
def method_2()
super("bar")
end
end
这是我在尝试时得到的:
inst_A = A.new
inst_A.method_1("foo")
# >> Using method_1 with argument value 'foo'
inst_A.method_2("bar")
# >> Using method_1 with argument value 'bar'
我已经不明白了:
inst_B = B.new
inst_B.method_1
# >> Using method_1 with argument value 'foo'
inst_B.method_2
# >> Error: #<ArgumentError: wrong number of arguments (1 for 0)>
# >> <main>:11:in `method_1'
# >> <main>:6:in `method_2'
# >> <main>:16:in `method_2'
为什么在调用B#method_2 时调用B#method_1,而不是A#method_1?
【问题讨论】:
-
我猜你得到一个错误是因为 Ruby 不支持方法重载?当您继承 B
-
如果您从消息发送的角度考虑会更容易。
method_1(arg)将消息method_1发送到self,即inst_B。然后 Ruby 搜索与该名称匹配的方法,从B的方法开始并找到B#method_1。
标签: ruby inheritance super