[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Call functions of superclass

Bart Braem

8/23/2006 3:26:00 PM

I'd like to be able to do
class Parent
def iamuseful
end
end
class Child
def iamuseful
# do stuff
super.iamuseful
end
end
But that gives strange results, I seem to be unable to call methods from a
superclass?

Bart
65 Answers

Farrel Lifson

8/23/2006 3:37:00 PM

0

On 23/08/06, Bart Braem <bart.braem@gmail.com> wrote:
> I'd like to be able to do
> class Parent
> def iamuseful
> end
> end
> class Child
> def iamuseful
> # do stuff
> super.iamuseful
> end
> end
> But that gives strange results, I seem to be unable to call methods from a
> superclass?
>
> Bart
>
>

class Parent
def useful(parameters)
#Do stuff
end
end
class Child < Parent
def useful(parameters)
super(parameters)
# Do more stuff..
end
end

Farrel

James Gray

8/23/2006 3:40:00 PM

0

On Aug 23, 2006, at 10:30 AM, Bart Braem wrote:

> I'd like to be able to do
> class Parent
> def iamuseful
> end
> end
> class Child

class Child < Parent

> def iamuseful
> # do stuff
> super.iamuseful
> end
> end
> But that gives strange results, I seem to be unable to call methods
> from a
> superclass?

Try the correction above. ;)

James Edward Gray II

Julian 'Julik' Tarkhanov

8/23/2006 3:44:00 PM

0


On 23-aug-2006, at 17:39, James Edward Gray II wrote:

> Try the correction above. ;)

Actually I am curious to know:

class Parent
def something
end

def another
# do foo
end
end

class Child < Parent
def something
super.another # call _another_ instance method BUT of the
superclass, not one's own
end

def another
# do bar instead of foo
end
end

is that at all possible somehow? Just out of curiosity.
--
Julian 'Julik' Tarkhanov
please send all personal mail to
me at julik.nl



William Crawford

8/23/2006 4:02:00 PM

0

Julian 'Julik' Tarkhanov wrote:
> On 23-aug-2006, at 17:39, James Edward Gray II wrote:
>
>> Try the correction above. ;)
>
> Actually I am curious to know:
>
> class Parent
> def something
> end
>
> def another
> # do foo
> end
> end
>
> class Child < Parent
> def something
super # call _another_ instance method BUT of the
> superclass, not one's own
> end
>
> def another
> # do bar instead of foo
> end
> end
>
> is that at all possible somehow? Just out of curiosity.

I think that's what you are wanting. It calls the parent's 'another'
method with the exact same parameters as were passed to child's
'another' method. If you want parameters that are different, simply
specify them as if you were calling 'Parent.another(parameter)'. (ie:
super(parameter) )

--
Posted via http://www.ruby-....

Nate Smith

8/23/2006 4:11:00 PM

0

Morton Goldberg

8/23/2006 4:38:00 PM

0

To satisfy your curiosity,

<code>
#! /usr/bin/ruby -w

class Parent

def something
puts "Parent something"
end

def another
puts "Parent another"
end

end

class Child < Parent

def something
puts "Child something"
super.another
end

def another
puts "Child another"
end

end

Child.new.something
</code>

<result>
Child something
Parent something
/Users/mg/Desktop/test.rb:19:in `something': undefined method
`another' for nil:NilClass (NoMethodError)
from /Users/mg/Desktop/test.rb:28
</result>

From which I conclude that 'super.another' is parsed as 'super
nil.another'

Regards, Morton

On Aug 23, 2006, at 11:44 AM, Julian 'Julik' Tarkhanov wrote:

> class Parent
> def something
> end
>
> def another
> # do foo
> end
> end
>
> class Child < Parent
> def something
> super.another # call _another_ instance method BUT of the
> superclass, not one's own
> end
>
> def another
> # do bar instead of foo
> end
> end


Douglas A. Seifert

8/23/2006 4:39:00 PM

0

Nathan Smith wrote:
> On Thu, 24 Aug 2006, William Crawford wrote:
>
>
>> Julian 'Julik' Tarkhanov wrote:
>>
>>> On 23-aug-2006, at 17:39, James Edward Gray II wrote:
>>>
>>>
>>>> Try the correction above. ;)
>>>>
>>> Actually I am curious to know:
>>>
>>> class Parent
>>> def something
>>> end
>>>
>>> def another
>>> # do foo
>>> end
>>> end
>>>
>>> class Child < Parent
>>> def something
>>>
>> super # call _another_ instance method BUT of the
>>
>>> superclass, not one's own
>>> end
>>>
>>> def another
>>> # do bar instead of foo
>>> end
>>> end
>>>
>>> is that at all possible somehow? Just out of curiosity.
>>>
>> I think that's what you are wanting. It calls the parent's 'another'
>> method with the exact same parameters as were passed to child's
>> 'another' method. If you want parameters that are different, simply
>> specify them as if you were calling 'Parent.another(parameter)'. (ie:
>> super(parameter) )
>>
>
> I think he's wanting to know if it's possible to call a different method
> of the superclass than the method that the interpreter is in. For example,
>
> class A
> def zoo
> puts "in zoo"
> end
> end
>
> class B < A
> def hoo
> super.zoo
> end
> end
>
> b = B.new
> b.hoo
>
>
> will not work -- you must explicitly define method #zoo in class B in
> order to call the super version of it in class A. Is there a way to make
> the above code work, short of defining zoo in B? I'm curious about this
> also.
>
> Nate
>
Why would you need to explicitly reference super? It is not necessary:

$ irb
irb(main):001:0> class Parent
irb(main):002:1> def zoo
irb(main):003:2> puts "zoo in Parent!"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0>
irb(main):007:0* class Child < Parent
irb(main):008:1> def hoo
irb(main):009:2> zoo
irb(main):010:2> end
irb(main):011:1> end
=> nil
irb(main):013:0> c = Child.new
=> #<Child:0x39dd78>
irb(main):014:0> c.hoo
zoo in Parent!
=> nil
irb(main):015:0>

If there is some common functionality that needs to be accessed by two
methods, one defined in the child class, the other defined in the parent
class, I'd say refactor it out into a method in the Parent class and
call it from wherever it is needed:

$ irb
irb(main):001:0> class Parent
irb(main):002:1> def common
irb(main):003:2> puts "common in Parent"
irb(main):004:2> end
irb(main):005:1> def foo
irb(main):006:2> puts "foo in Parent"
irb(main):007:2> common
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> class Child < Parent
irb(main):011:1> def bar
irb(main):012:2> puts "bar in Child"
irb(main):013:2> common
irb(main):014:2> end
irb(main):015:1> end
=> nil
irb(main):016:0> c = Child.new
=> #<Child:0x392c30>
irb(main):017:0> c.bar
bar in Child
common in Parent
=> nil
irb(main):018:0> c.foo
foo in Parent
common in Parent
=> nil


Cheers,
Doug

Isak Hansen

8/23/2006 4:40:00 PM

0

Julian 'Julik' Tarkhanov wrote:
>
> On 23-aug-2006, at 17:39, James Edward Gray II wrote:
>
>> Try the correction above. ;)
>
> Actually I am curious to know:
>
> class Parent
> def something
> end
>
> def another
> # do foo
> end
> end
>
> class Child < Parent
> def something
> super.another # call _another_ instance method BUT of the
> superclass, not one's own
> end
>
> def another
> # do bar instead of foo
> end
> end
>
> is that at all possible somehow? Just out of curiosity.


Don't have too much exposure to Ruby myself, but spent some time on
#ruby-lang asking getting answers to this and the OP's questions a
couple of days ago.

AFAIK 'super' simply invokes the overriden method, so your example would
be calling the method 'another', on whatever object is returned by
Parent::something().

I don't think there's any way to refer to an object as if it had the
base classes' type, but you can alias the method before overriding it:

class Child < Parent

def something
old_another
end

alias :old_another :another
def another
# overriding the old one
end
end


Isak


> --Julian 'Julik' Tarkhanov
> please send all personal mail to
> me at julik.nl
>
>
>

William Crawford

8/23/2006 4:43:00 PM

0

Douglas A. Seifert wrote:

> Why would you need to explicitly reference super? It is not necessary:

He has redefined the 'another' method in the child class. But for some
reason, he needs the 'another' method in the parent class instead.

--
Posted via http://www.ruby-....

ts

8/23/2006 4:43:00 PM

0

>>>>> "M" == Morton Goldberg <m_goldberg@ameritech.net> writes:

M> From which I conclude that 'super.another' is parsed as 'super
M> nil.another'

No, not really

super call Parent#something which return nil (the result of #puts)
ruby use the result of super (i.e. nil) to call #another
because nil don't respond to #another, it give an error


Guy Decoux