Bind to an "as if" superclass context

T

Trans

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

Logan Capaldo

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

Trans

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

Logan Capaldo

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

Trans

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top