Делегирование в реализацию базового класса - PullRequest
0 голосов
/ 25 октября 2010

Как я могу делегировать вызовы внутри базового класса реализации базового класса, а не реализации унаследованного класса? Например:

class A 

 def foo
  p "hello"
 end

 def bar
  foo 
 end

end 

class B < A

  def foo
    p "world"
  end  

end


A.new.bar
# prints "hello"

B.new.foo
# prints "world"


B.new.bar
# prints "world"
# the function should print "hello" instead

В приведенном выше примере, какой самый элегантный способ печати hello, когда метод foo вызывается в базовом классе методом bar?

1 Ответ

0 голосов
/ 25 октября 2010

Исходя из моего понимания алгоритма поиска метода ruby, я не верю, что можно достичь того, что вы пытаетесь сделать, без использования разных имен методов или без чрезмерного удаления метода bar в подклассе.

Проблема в том, что "self", которое получает сообщение foo при вызове методом bar в классе A, всегда будет экземпляром класса B (при вызове из экземпляра класса B).Поскольку собственный метод foo класса B всегда будет сначала найден алгоритмом поиска метода ruby, нет способа вызвать оригинальный метод foo класса A (ведь класс B переопределяет унаследованный метод foo класса A).

A notтаким элегантным решением было бы использование «вокруг псевдонимов», как показано ниже, но оно также требует переопределения метода bar:

class B < A
  alias :old_foo :foo

  def foo
    p "world"
  end

  def bar
    old_foo
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...