Calling an arbitrary superclass method

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.

···

__________________________________
Yahoo! Mail Mobile
Take Yahoo! Mail with you! Check email on your mobile phone.
http://mobile.yahoo.com/learn/mail

self.class.superclass.instance_method(:some_method).bind(self).call(*args)

···

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.

__________________________________
Yahoo! Mail Mobile
Take Yahoo! Mail with you! Check email on your mobile phone.
http://mobile.yahoo.com/learn/mail

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)
end
def super_send(sym,*args)
    super_method(sym).call(*args)
end
end

···

--- 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)

____________________________________________________
Yahoo! Sports
Rekindle the Rivalries. Sign up for Fantasy Football

Forgot the bind(self). Added it above.

···

--- Eric Mahurin <eric_mahurin@yahoo.com> 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

__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around

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)
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.

···

--- Logan Capaldo <logancapaldo@gmail.com> wrote:
> On Jul 3, 2005, at 3:31 PM, Eric Mahurin wrote:

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.

···

--- 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.

____________________________________________________
Yahoo! Sports
Rekindle the Rivalries. Sign up for Fantasy Football

Eric Mahurin wrote:

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

···

--- redentis <redentis@gmail.com> wrote:

--- Logan Capaldo <logancapaldo@gmail.com> wrote:

On Jul 3, 2005, at 3:31 PM, Eric Mahurin wrote: