[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Bind to an "as if" superclass context

Trans

8/25/2007 1:16:00 PM

Is there a way to do the "opposite" of binding a superclass method to
the current context? In other words, I want to call a method as if the
current binding were an instance of the superclass. For example, using
the method #public_methods as a basis of demonstration (could be any
method though):

class X
def a; "a"; end
end

class Y < X
def b; "b"; end

def public_methods(all=true)
# ?

self.class.superclass.instance_method(:public_methods).bind(self).call(all)
end
end

y = Y.new

p y.public_methods(false)

Of course, that produces

['b', 'public_methods']

But what I want is:

['a']

I suspect there's no way to do this short of resorting to delegation
rather than subclassing. But I wanted to ask and make sure.

Thanks,
T.


4 Answers

Logan Capaldo

8/25/2007 3:12:00 PM

0

On 8/25/07, Trans <transfire@gmail.com> wrote:
> Is there a way to do the "opposite" of binding a superclass method to
> the current context? In other words, I want to call a method as if the
> current binding were an instance of the superclass. For example, using
> the method #public_methods as a basis of demonstration (could be any
> method though):
>
> class X
> def a; "a"; end
> end
>
> class Y < X
> def b; "b"; end
>
> def public_methods(all=true)
> # ?
>
> self.class.superclass.instance_method(:public_methods).bind(self).call(all)
> end
> end
>
> y = Y.new
>
> p y.public_methods(false)
>
> Of course, that produces
>
> ['b', 'public_methods']
>
> But what I want is:
>
> ['a']
>
> I suspect there's no way to do this short of resorting to delegation
> rather than subclassing. But I wanted to ask and make sure.
>

Well, I don't know about in general, but for this particular instance
(and similar ones) you could just do
class X
def a; "a"; end
end

class Y < X
def b; "b"; end
def public_methods(all = true)
self.class.superclass.public_instance_methods(all)
end
end


Incidently, you do realize that the whole mess of
self.class.superclass.instance_method(:public_methods).call(all) is
exactly equivalent to super right? At least in the context of
overriding public_methods anyway. And of course def foo(); super; end
is the same as not writing foo at all, so it's not surprising you get
the same result.

> Thanks,
> T.
>
>
>

Trans

8/26/2007 2:44:00 AM

0



On Aug 25, 8:12 am, "Logan Capaldo" <logancapa...@gmail.com> wrote:

> Well, I don't know about in general, but for this particular instance
> (and similar ones) you could just do
>
> class X
> def a; "a"; end
> end
>
> class Y < X
> def b; "b"; end
> def public_methods(all = true)
> self.class.superclass.public_instance_methods(all)
> end
> end

Yep. I was hoping to avoid that if possible. It will a chore to makes
sure I cover all the ones that matter, and that I've emulated
properly.

> Incidently, you do realize that the whole mess of
> self.class.superclass.instance_method(:public_methods).call(all) is
> exactly equivalent to super right? At least in the context of
> overriding public_methods anyway. And of course def foo(); super; end
> is the same as not writing foo at all, so it's not surprising you get
> the same result.

Sure. That was just the "opposite" example of what I was trying to do.
Ie. rather than binding a super method to the current context, I'm
trying to bind a method "as if" to a super context.

Also, I realized that delegation is out of the question for what I'm
trying to do. So I will have to deal with this issue in some fashion.

Thanks,
T.


Logan Capaldo

8/27/2007 1:00:00 AM

0

On 8/25/07, Trans <transfire@gmail.com> wrote:
>
> Sure. That was just the "opposite" example of what I was trying to do.
> Ie. rather than binding a super method to the current context, I'm
> trying to bind a method "as if" to a super context.
>
> Also, I realized that delegation is out of the question for what I'm
> trying to do. So I will have to deal with this issue in some fashion.
>
Had a thought, what if you do "reverse" delegation?
Instead of having a subclass instance delegate to an instance of super
class, have a super class delegate to an instance of a subclass

I don't know how feasible this idea is, as I don't know your class
hierarchy, but it's an idea.
> Thanks,
> T.
>
>
>

Trans

8/27/2007 3:08:00 PM

0


On Aug 26, 6:00 pm, "Logan Capaldo" <logancapa...@gmail.com> wrote:
>
> Had a thought, what if you do "reverse" delegation?
> Instead of having a subclass instance delegate to an instance of super
> class, have a super class delegate to an instance of a subclass
>
> I don't know how feasible this idea is, as I don't know your class
> hierarchy, but it's an idea.

Thanks. A fair suggestion, that under other circumstances might do the
trick. Unfortunately, my purposes are quite a bit more difficult. I'm
attempting to implement Cuts (transparent subclasses) in pure Ruby.
The essential operation of this is to subclass the original class, but
have the subclass behave for all "meta-purposes" as if it were the
original class.

T.