[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Super super ?

Marc-antoine Kruzik

5/19/2009 7:29:00 PM

Hello, I'm looking for informations about "super".

I have 3 classes : grandfather, father, and son.
And they all have a method named "say_hello".



[code]
class Grand_father
def say_hello
puts "Grand Father : Hello"
end
end

class Father < Grand_father
def say_hello
super
puts "Father : Hello"
end
end

class Son < Father
def say_hello
super
puts "Son : Hello"
end
end
[/code]

s = Son.new
s.say_hello
Grand Father : Hello
Father : Hello
Son : Hello

But now, I would that Son didn't call Father, but directly Grand_father.

s.say_hello
Grand Father : Hello
Son : Hello

How could I do that ?
--
Posted via http://www.ruby-....

12 Answers

Ilan Berci

5/19/2009 8:37:00 PM

0

Marc-antoine Kruzik wrote:

>
> But now, I would that Son didn't call Father, but directly Grand_father.
>
> s.say_hello
> Grand Father : Hello
> Son : Hello
>
> How could I do that ?

I am taking a break at work so I can't test it, but could you please
try:
super.super.say_hello
--
Posted via http://www.ruby-....

Robert Klemme

5/19/2009 8:43:00 PM

0

On 19.05.2009 21:29, Marc-antoine Kruzik wrote:
> Hello, I'm looking for informations about "super".
>
> I have 3 classes : grandfather, father, and son.
> And they all have a method named "say_hello".
>
>
>
> [code]
> class Grand_father
> def say_hello
> puts "Grand Father : Hello"
> end
> end
>
> class Father < Grand_father
> def say_hello
> super
> puts "Father : Hello"
> end
> end
>
> class Son < Father
> def say_hello
> super
> puts "Son : Hello"
> end
> end
> [/code]
>
> s = Son.new
> s.say_hello
> Grand Father : Hello
> Father : Hello
> Son : Hello
>
> But now, I would that Son didn't call Father, but directly Grand_father.
>
> s.say_hello
> Grand Father : Hello
> Son : Hello
>
> How could I do that ?

You can do

class Son < Father
def say_hello
Grand_father.instance_method(:say_hello).bind(self).call
puts "Son : Hello"
end
end

However, as the weird construction indicates something might be wrong
with this kind of design. If you assume that the method actually had
side effects on the instance's state and you leave out one class in the
chain you likely end up with an instance in an inconsistent state. In
that case the design probably needs some work.

Btw, if Father does not define say_hello super will automatically call
Grand_father's method.

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestprac...

Robert Klemme

5/19/2009 9:17:00 PM

0

On 19.05.2009 22:36, Ilan Berci wrote:
> Marc-antoine Kruzik wrote:
>
>> But now, I would that Son didn't call Father, but directly Grand_father.
>>
>> s.say_hello
>> Grand Father : Hello
>> Son : Hello
>>
>> How could I do that ?
>
> I am taking a break at work so I can't test it, but could you please
> try:
> super.super.say_hello

This won't work - at least not in the way you intended. :-)

Kind regards

robert


--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestprac...

F. Senault

5/20/2009 8:00:00 AM

0

Le 19 mai à 21:29, Marc-antoine Kruzik a écrit :

> Hello, I'm looking for informations about "super".
/.../
> I have 3 classes : grandfather, father, and son.
> And they all have a method named "say_hello".
> But now, I would that Son didn't call Father, but directly Grand_father.
>
> s.say_hello
> Grand Father : Hello
> Son : Hello
>
> How could I do that ?

As others said, refactor, there's a problem with you inheritance logic.

That being said, you could work in the Father class like this to obtain
the wanted result :


class Father < Grand_father
def say_hello
super
puts "Father : Hello" unless self.is_a? Son
end
end

Fred
--
First, there was the command-line interface. This allowed users to type
a line of text representing a "command", press the RETURN key, and
receive a response like "0x38754: ERROR_NOTEXT_PETUNIA". Thanks to this
handy software tool, the suicide rate rose almost overnight. (D Barrett)

Robert Klemme

5/20/2009 8:51:00 AM

0

2009/5/20 F. Senault <fred@lacave.net>:

> That being said, you could work in the Father class like this to obtain
> the wanted result :
>
>
> class Father < Grand_father
> =A0def say_hello
> =A0 =A0super
> =A0 =A0puts "Father : Hello" unless self.is_a? Son
> =A0end
> end

Frankly, I find that even worse than my hack. The reason: now Father
needs to know something about a sub class so we have a circular
dependency. That's usually a bad thing to have. Consider, all these
classes are in different files and someone only needs Father and
Grand_father: code will break in Father because Son is undefined.
It's ok if Son knows something about his parents but not otherwise.

Kind regards

robert


--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestprac...

KDr2

5/20/2009 9:23:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

class Object
def super!(n,*args)
method=caller[0][%r/.*?`(.*?)'/,1].to_sym
klass=self.class.ancestors[n]
klass.instance_method(method).bind(self).call(*args)
end
end


class Grand_father
def say_hello
puts "Grand Father : Hello"
end
end

class Father < Grand_father
def say_hello
super
puts "Father : Hello"
end
end

class Son < Father
def say_hello
super! 2
puts "Son : Hello"
end
end

s = Son.new
s.say_hello


On Wed, May 20, 2009 at 3:29 AM, Marc-antoine Kruzik
<kadelfek@kadelfek.com>wrote:

> s = Son.new
> s.say_hello
>



--
Best Regards,
-- KDr2, at x-macro.com.

F. Senault

5/20/2009 9:24:00 AM

0

Le 20 mai à 10:51, Robert Klemme a écrit :

> Frankly, I find that even worse than my hack.

Of course... :)

Fred
--
Au bout De la course Remonte jusqu'a A la source One trip One noise
Circuit Nuit bleue Spécialiste De l'enjeu One trip One noise
Longue attente avant de s'elancer One trip (Noir Désir,
Longue vie et tout a recracher One noise One Trip / One Noise)

Marc-antoine Kruzik

5/20/2009 1:40:00 PM

0

Ilan Berci wrote:
> I am taking a break at work so I can't test it, but could you please
> try:
> super.super.say_hello

Too bad it doesn't work. But it was pretty logical. :)


@ KDr2

That is exactly what I needed ! :D
Thank you very much.
--
Posted via http://www.ruby-....

Codeblogger

5/20/2009 2:43:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

2009/5/20 Marc-antoine Kruzik <kadelfek@kadelfek.com>

>
> Too bad it doesn't work. But it was pretty logical. :)
>
>
I don't think it was logical, but I guess, that's a matter of taste and
expectation of what 'super' does.
And still: KDr2's solution is bad software design.

Regards
Nicolai

Ilan Berci

5/20/2009 2:46:00 PM

0

Robert Klemme wrote:

>
> class Son < Father
> def say_hello
> Grand_father.instance_method(:say_hello).bind(self).call
> puts "Son : Hello"
> end
> end
>
>

Ahh.. cool! Thanks for the bind() solution, I am aware of it but it
always falls to the back of my head.. I blame either my age, marriage,
or kids on this one..

ilan


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