Подтвердить что ты не робот

Метод вызова в родительском классе из методов подкласса в Ruby

Я использовал super для инициализации родительского класса, но я не вижу способа вызова родительского класса из методов подкласса.

Я знаю, что PHP и другие языки имеют эту функцию, но не могут найти хороший способ сделать это в Ruby.

Что бы вы сделали в этой ситуации?

4b9b3361

Ответ 1

Если метод имеет одно и то же имя, т.е. вы переопределяете метод, вы можете просто использовать super. В противном случае вы можете использовать alias_method или привязку.

class Parent
    def method
    end
end

class Child < Parent
    alias_method :parent_method, :method
    def method
        super
    end

    def other_method
        parent_method
        #OR
        Parent.instance_method(:method).bind(self).call
    end
end

Ответ 2

super ключевое слово вызывает метод с таким же именем в суперклассе:

class Foo
  def foo
    "#{self.class}#foo"
  end
end

class Bar < Foo
  def foo
    "Super says: #{super}"
  end
end

Foo.new.foo # => "Foo#foo"
Bar.new.foo # => "Super says: Bar#foo"

Ответ 3

Ключевое слово super в Ruby на самом деле вызывает метод с тем же именем в родительском классе. (источник)

class Foo
  def foo
    # Do something
  end
end

class Bar < Foo
  def foo
    super # Calls foo() method in parent class
  end
end

Ответ 4

Другие говорили об этом уже хорошо. Еще одно примечание:

Синтаксис super.foo для вызова метода foo в суперклассе не поддерживается. Скорее он вызовет метод super и возвращаемый результат, попробуйте вызвать foo.

  class A
    def a
      "A::a"
    end
  end

  class B < A
    def a
      "B::a is calling #{super.a}" # -> undefined method `a` for StringClass 
    end
  end