В приведенном ниже дизайне наследования классов класс 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
?
method_1(arg)
отправляет сообщениеmethod_1
self
, т.е.inst_B
. Затем Ruby ищет метод, соответствующий этому имени, начиная с методовB
, и находитB#method_1
. - person Stefan   schedule 08.05.2018