Eric Mahurin wrote: > --- redentis <redentis / gmail.com> wrote: > >> Eric Mahurin wrote: >>> --- Logan Capaldo <logancapaldo / gmail.com> wrote: >>>> On Jul 3, 2005, at 3:31 PM, Eric Mahurin wrote: >>>> >>>>> Anybody know of a way to call an arbitrary method in the >>>>> superclass? In the current method, you can use "super" to call >>>>> the same method of the superclass, but how do you call another? >>>>> The only way I can think of off hand is to alias the >>>>> superclass methods to something else before creating the >>>>> derived class definition. But, that seems kind of ugly. It >>>>> seems like there should be a way to call it directly using >>>>> superclass or something. >>> >>>> self.class.superclass. >>>> instance_method(:some_method).bind(self).call(*args) >>> >>> That is the magic I was looking for. Thanks. >>> >>> I think it would be nice if we had something like this in >>> Object to make it easier (and faster when written in C): >>> >>> class Object >>> def super_method(sym) >>> self.class.superclass.instance_method(sym).bind(self) >>> end >>> def super_send(sym,*args) >>> super_method(sym).call(*args) >>> end >>> end >> >> What scenario(s) do you think this would be useful in? Surely >> the whole >> point of the OO principles of polymorphism and implementation >> hiding is >> that you should never need to "call an arbitrary method in >> the >> superclass". >> >> The only case I can think of where you might want to access >> the >> superclass implementation is in an overriding method in a >> subclass and >> at that point 'super' does what you'd expect: gives you >> essentially >> privileged access to the implementation in the super class. > > That is exactly what I want to do. I want to be able to call > more than just the superclass method of the same name that > "super" allows me to. > > These methods should be "protected" so that only derived > classes are using them. But then what do you need the explicitely selection of the class for? Just call the method - if it's overridden then that version is invoked (and can use super to invoke the super class impl); if not the super class method is invoked anyway. If you need to selectively call methods of specific super classes that are overridden that's a strong indication that a refactoring is in order IMHO. Kind regards robert