我用super
來初始化父類,但我看不到任何從子類方法調用父類的方法。Ruby中的子類方法在父類中調用方法
我知道PHP和其他語言確實有這個功能,但是找不到在Ruby中這樣做的好方法。
在這種情況下會做什麼?
我用super
來初始化父類,但我看不到任何從子類方法調用父類的方法。Ruby中的子類方法在父類中調用方法
我知道PHP和其他語言確實有這個功能,但是找不到在Ruby中這樣做的好方法。
在這種情況下會做什麼?
如果方法是相同的名稱,即您重寫一個方法,您可以簡單地使用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
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
如果請求者明確提到PHP是他知道的其他語言,那麼在Java中放入一個示例並不是最好的想法... –
這個答案對我有幫助,他說他知道PHP和其他語言具有此功能(不是他只知道PHP)。 –
的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"
其他人說,它已經很好。只需要注意一點:
在超類中調用方法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
這是人們應該注意的重要區別,所以謝謝指出! – Magne
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
和self.class.superclass
將調用Parent
而 super
調用的Parent
的parent_method
(實例方法)self.parent_method
(類方法)。
這不起作用。 'Child.new.other_method'返回#NoMethodError:super:#'沒有超類方法'other_method'。對'super.method()'的調用只會在調用返回到'super'(在這種情況下不存在)的情況下調用'method'。 'super'不是對一個實例的'superclass'的引用。 –
Cade
@說明你完全正確。我編輯了這個 –
也調用'super'將調用super,並傳遞給子方法的確切參數。如果你想通過調用super來指定指定參數:EG:'def child(a,b);超; (a,b);超級(somevar); end' – Adam