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
будет вызывать self.parent_method
(метод класс) Parent
в то время как super
вызывает (метод экземпляра) parent_method
из Parent
.
Это не работает. 'Child.new.other_method' возвращает' NoMethodError: super: no superclass method 'other_method' для # '. Вызов 'super.method()' будет вызывать 'метод' только при вызове' super' (который в этом случае не существует). 'super' не является ссылкой на« суперкласс »экземпляра. –
Cade
@ Признайте, что вы абсолютно правы. Я сделал редактирование для этого –
Также вызов 'super' вызовет супер с точными аргументами, которые были переданы дочернему методу. Если вы хотите указать заданные аргументы, вы можете вызвать супер с ними: EG: 'def child (a, b); супер; end' vs 'def child (a, b); супер (somevar); end' – Adam