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