2013-08-26 173 views

回答

62

如果方法是相同的名稱,即您重寫一個方法,您可以簡單地使用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 
+0

這不起作用。 'Child.new.other_method'返回#NoMethodError:super:#'沒有超類方法'other_method'。對'super.method()'的調用只會在調用返回到'super'(在這種情況下不存在)的情況下調用'method'。 'super'不是對一個實例的'superclass'的引用。 – Cade

+0

@說明你完全正確。我編輯了這個 –

+1

也調用'super'將調用super,並傳遞給子方法的確切參數。如果你想通過調用super來指定指定參數:EG:'def child(a,b);超; (a,b);超級(somevar); end' – Adam

11

Ruby中super關鍵字實際上調用父類的同名方法。 (source

class Foo 
    def foo 
    # Do something 
    end 
end 

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

如果請求者明確提到PHP是他知道的其他語言,那麼在Java中放入一個示例並不是最好的想法... –

+1

這個答案對我有幫助,他說他知道PHP和其他語言具有此功能(不是他只知道PHP)。 –

15

super keyword調用同名的超類中的方法:

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" 
5

其他人說,它已經很好。只需要注意一點:

在超類中調用方法foo的語法super.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 
+0

這是人們應該注意的重要區別,所以謝謝指出! – Magne

0
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_methodself.class.superclass將調用Parentsuper調用的Parentparent_method(實例方法)self.parent_method(類方法)。