programacion objetos metodos manejo instanciar importar herencia ejemplos clases ruby

metodos - manejo de objetos en ruby



llamando a otro método en súper clase en rubí (3)

class A def a puts ''in #a'' end end class B < A def a b() end def b # here i want to call A#a. end end


No hay una buena forma de hacerlo, pero puedes hacer A.instance_method(:a).bind(self).call , que funcionará, pero es feo.

Incluso podrías definir tu propio método en Object para que actúe como super en java:

class SuperProxy def initialize(obj) @obj = obj end def method_missing(meth, *args, &blk) @obj.class.superclass.instance_method(meth).bind(@obj).call(*args, &blk) end end class Object private def sup SuperProxy.new(self) end end class A def a puts "In A#a" end end class B<A def a end def b sup.a end end B.new.b # Prints in A#a


Si no necesita explícitamente llamar a A # a desde B # b, sino que necesita llamar a A # a desde B # a, que es efectivamente lo que está haciendo por medio de B # b (a menos que sea un ejemplo no es lo suficientemente completo como para demostrar por qué llamas desde B # b, solo puedes llamar super desde dentro de B # a, como a veces se hace con los métodos de inicialización. Sé que esto es algo obvio, solo quería aclarar para cualquier recién llegado de Ruby que no tenga alias (específicamente, a veces se denomina "alias") en todos los casos.

class A def a # do stuff for A end end class B < A def a # do some stuff specific to B super # or use super() if you don''t want super to pass on any args that method a might have had # super/super() can also be called first # it should be noted that some design patterns call for avoiding this construct # as it creates a tight coupling between the classes. If you control both # classes, it''s not as big a deal, but if the superclass is outside your control # it could change, w/o you knowing. This is pretty much composition vs inheritance end end


class B < A alias :super_a :a def a b() end def b super_a() end end