64

我曾经super初始化父类,但我看不到从子类方法调用父类的任何方式。

我知道 PHP 和其他语言确实具有此功能,但无法在 Ruby 中找到实现此功能的好方法。

在这种情况下会怎么做?

4

5 回答 5

101

如果方法是同名的,即你覆盖了一个你可以简单地使用的方法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
于 2013-08-26T16:40:07.423 回答
22

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"
于 2013-08-26T16:47:00.917 回答
18

Ruby 中的super关键字实际上调用了父类中的同名方法。(来源

class Foo
  def foo
    # Do something
  end
end

class Bar < Foo
  def foo
    super # Calls foo() method in parent class
  end
end
于 2013-08-26T16:41:32.210 回答
15

其他人已经说得很好。还有一个额外的注意事项:

不支持在超类中super.foo调用方法的语法。相反,它将调用- 方法并在返回的结果上尝试调用.foosuperfoo

  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
于 2015-08-31T22:33:54.567 回答
7
class Parent
  def self.parent_method
    "#{self} called parent method"
  end

  def parent_method
    "#{self} called parent method"
  end
end

class Child < Parent

  def parent_method
    # call parent_method as
    Parent.parent_method                # self.parent_method gets invoked
    # call parent_method as
    self.class.superclass.parent_method # self.parent_method gets invoked
    super                               # parent_method gets invoked 
    "#{self} called parent method"      # returns "#<Child:0x00556c435773f8> called parent method"
  end

end

Child.new.parent_method  #This will produce following output
Parent called parent method
Parent called parent method
#<Child:0x00556c435773f8> called parent method
#=> "#<Child:0x00556c435773f8> called parent method"

self.class.superclass == Parent #=> true

Parent.parent_method and self.class.superclass will call self.parent_method(class method) of Parent while super calls the parent_method(instance method) of Parent.

于 2018-02-07T08:32:28.083 回答