вызов другого метода в суперклассе в ruby - PullRequest
47 голосов
/ 09 августа 2009
class A
  def a
    puts 'in #a'
  end
end

class B < A
  def a
    b()
  end
  def b
    # here i want to call A#a.
  end
end  

Ответы [ 3 ]

80 голосов
/ 09 августа 2009
class B < A

  alias :super_a :a

  def a
    b()
  end
  def b
    super_a()
  end
end  
30 голосов
/ 09 августа 2009

Нет хорошего способа сделать это, но вы можете сделать A.instance_method(:a).bind(self).call, который будет работать, но безобразно.

Вы даже можете определить свой собственный метод в Object, чтобы он действовал как супер в Java:

class SuperProxy
  def initialize(obj)
    @obj = obj
  end

  def method_missing(meth, *args, &blk)
    @obj.class.superclass.instance_method(meth).bind(@obj).call(*args, &blk)
  end
end

class Object
  private
  def sup
    SuperProxy.new(self)
  end
end

class A
  def a
    puts "In A#a"
  end
end

class B<A
  def a
  end

  def b
    sup.a
  end
end
B.new.b # Prints in A#a
0 голосов
/ 21 апреля 2015

Если вам явно не нужно вызывать A # a из B # b, а нужно вызывать A # a из B # a, что фактически делает то, что вы делаете с помощью B # b (если вы не Пример не достаточно полный, чтобы продемонстрировать, почему вы звоните из B # b, вы можете просто вызвать super изнутри B # a, как это иногда делается в методах инициализации. Я знаю, это довольно очевидно, я просто Я хотел бы уточнить для новичков в Ruby, что вам не нужно использовать псевдоним (в частности, это иногда называют «псевдонимом вокруг») в каждом случае.

class A
  def a
    # do stuff for A
  end
end

class B < A
  def a
    # do some stuff specific to B
    super
    # or use super() if you don't want super to pass on any args that method a might have had
    # super/super() can also be called first
    # it should be noted that some design patterns call for avoiding this construct
    # as it creates a tight coupling between the classes.  If you control both
    # classes, it's not as big a deal, but if the superclass is outside your control
    # it could change, w/o you knowing.  This is pretty much composition vs inheritance
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...