2013-08-26 8 views

risposta

62

Se il metodo è lo stesso nome, cioè si sta sovrascrivendo un metodo, è sufficiente utilizzare super. Altrimenti puoi usare uno alias_method o un binding.

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

Questo non funziona. 'Child.new.other_method' restituisce' NoMethodError: super: nessun metodo superclasse 'other_method' per # '. La chiamata a 'super.method()' chiamerà solo 'method' su ciò che viene restituito dalla chiamata a' super' (che, in questo caso, non esiste). 'super' non è un riferimento alla' superclasse' di un'istanza. – Cade

+0

@Cade sei completamente corretto. Ho fatto la modifica per questo –

+1

Anche chiamando 'super' chiameremo super con argomenti esatti che sono stati passati al metodo figlio. Se vuoi specificare gli argomenti puoi chiamarli super con loro: EG: 'def child (a, b); super; fine' vs 'def child (a, b); super (somevar); end' – Adam

11

Il super parola chiave in Ruby in realtà chiama un metodo con lo stesso nome nella classe padre. (source)

class Foo 
    def foo 
    # Do something 
    end 
end 

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

Mettere un esempio in Java non è la migliore idea se il richiedente menziona esplicitamente PHP come altra lingua che conosce ... –

+1

questa risposta mi è stata di aiuto, e dice che conosce PHP E altre lingue hanno questa caratteristica (non quella conosce solo PHP). –

15

Il super keyword chiama un metodo con lo stesso nome nella classe 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" 
5

altri hanno detto che già bene. Solo una nota aggiuntiva di cautela:

La sintassi super.foo di chiamare il metodo foo nella classe Super è non supportato. Piuttosto chiamerà il metodo super e sul risultato restituito, prova a chiamare 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

Questa è una distinzione importante di cui le persone dovrebbero essere consapevoli, quindi grazie per averlo indicato! – 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_method e self.class.superclass chiamerà self.parent_method (metodo di classe) di Parent mentre super chiama il (metodo esempio) parent_method di Parent.

Problemi correlati