2017-08-30 1 views
0

Comment puis-je forcer la méthode 2 à appeler A :: method_1?Ruby: méthode d'appel de la classe en cours sans polymorphisme

class A 
    def method_1 
    puts "A" 
    end 

    def method_2 
    method_1 #call A::method_1 only if this is instance of A 
    end 
end 

class B < A 
    def method_1 
    puts "B" 
    end 
end 

B.new.method_2 

Dans la méthode d'implémentation habituelle, 1 est ignoré. Existe-t-il un moyen d'appeler des méthodes substituées de A?

+0

Pourquoi voulez-vous faire cela? – Stefan

+0

Recherche de la portée du langage. – MaxQwerty

+0

'method_1 si self.class == A'. – mudasobwa

Répondre

1

Alors qu'il est un peu étrange question, vous pouvez toujours mettre en œuvre exactement ce que vous voulez avec ce code:

class A 
    def method_1 
    puts "A" 
    end 

    def method_2 
    A.instance_method(:method_1).bind(self).call 
    end 
end 

class B < A 
    def method_1 
    puts "B" 
    end 
end 

puts B.new.method_2 
# => A 

Puisque vous avez instance de B, method_1 est écrasé. Mais vous pouvez pointer directement à A#method_1 via A.instance_method.

instance_method renvoie UnboundMethod, ce qui signifie qu'il ne fait pas référence à self. Donc, vous devez le lier avec .bind(self).

Ensuite, vous appelez une méthode avec .call.

+0

Ruby est assez flexible. En fonction de ce dont vous avez besoin, vous pouvez obtenir la méthode la plus bas avec quelque chose comme ceci 'method = b.method (: method_1)' et 'method = method.super_method while method.super_method' – Kukunin