[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Referring to method in enclosing class

Richard Everhart

1/31/2008 1:43:00 AM

I need to do something like what is being attempted in the code below.

The commented out code is what I can't figure out: how do methods in a
nested classes call methods in their enclosing class? Is this even
possible?

class Enclosing
def go
Hello.new.do_say_hello
end

def say_hello
"Hello World!"
end

class Hello
def do_say_hello
# puts Enclosing class's say_hello method
end
end

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

5 Answers

Gary Wright

1/31/2008 4:25:00 AM

0


On Jan 30, 2008, at 8:42 PM, Richard Everhart wrote:

> I need to do something like what is being attempted in the code below.
>
> The commented out code is what I can't figure out: how do methods in a
> nested classes call methods in their enclosing class? Is this even
> possible?
>
> class Enclosing
> def go
> Hello.new.do_say_hello
> end
>
> def say_hello
> "Hello World!"
> end
>
> class Hello
> def do_say_hello
> # puts Enclosing class's say_hello method
> end
> end
>
> end

This doesn't really make sense. First of all nested classes are just
a way to organize the *names* of classes. The nesting is completely
orthogonal to the inheritance hierarchy. In your example,
Enclosing and Enclosing::Hello are only related by their name.
Neither one is a subclass or parent of the other, they are both
subclasses of Object.

The second issue is that those are instance methods so you'll need an
instance of Enclosing and and instance of Hello before you can even
think of calling Hello#do_say_hello or Enclosing#say_hello.

I'm not sure what you are after but you kind of have two choices.
Make Hello a subclass of Enclosing, or make Enclosing a module and
include its methods into Hello. These examples below will 'work'
but they are awkward at best. I'm not sure exactly what you are
trying to do so I'm not sure what to suggest instead.


Subclass:

class Enclosing
def go
Hello.new.do_say_hello
end

def say_hello
"Hello World!"
end

class Hello < Enclosing
def do_say_hello
puts say_hello
end
end

end

Enclosing.new.go


# Module

module Enclosing
def go
Hello.new.do_say_hello
end

def say_hello
"Hello World!"
end

class Hello
include Enclosing
def do_say_hello
puts say_hello
end
end

end

Enclosing::Hello.new.go

7stud --

1/31/2008 7:57:00 AM

0

Richard Everhart wrote:
> I need to do something like what is being attempted in the code below.
>
> The commented out code is what I can't figure out: how do methods in a
> nested classes call methods in their enclosing class? Is this even
> possible?
>
> class Enclosing
> def go
> Hello.new.do_say_hello
> end
>
> def say_hello
> "Hello World!"
> end
>
> class Hello
> def do_say_hello
> # puts Enclosing class's say_hello method
> end
> end
>
> end


Why do you want to nest Hello inside Enclosing?

class Enclosing
def say_hello
puts "hi"
end
end

class Hello
def initialize
@e = Enclosing.new
end

def do_say_hello
@e.say_hello
end
end

h = Hello.new
h.do_say_hello

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

Richard Everhart

1/31/2008 10:23:00 PM

0

Thanks for the reply.

I wanted to add functionality to the enclosing class via the addition of
the enclosed class with minimal changes to the enclosing class and its
methods. Specifically, the enclosed class is intended to subclass a
threading framework class and, after instantiated, call methods on the
enclosing class. The enclosing class already extends another class.

I come from a Java background if that helps explaining anything about my
approach to this.

Rich

Gary Wright wrote:
> On Jan 30, 2008, at 8:42 PM, Richard Everhart wrote:
>
>>
>> end
> This doesn't really make sense. First of all nested classes are just
> a way to organize the *names* of classes. The nesting is completely
> orthogonal to the inheritance hierarchy. In your example,
> Enclosing and Enclosing::Hello are only related by their name.
> Neither one is a subclass or parent of the other, they are both
> subclasses of Object.
>
> The second issue is that those are instance methods so you'll need an
> instance of Enclosing and and instance of Hello before you can even
> think of calling Hello#do_say_hello or Enclosing#say_hello.
>
> I'm not sure what you are after but you kind of have two choices.
> Make Hello a subclass of Enclosing, or make Enclosing a module and
> include its methods into Hello. These examples below will 'work'
> but they are awkward at best. I'm not sure exactly what you are
> trying to do so I'm not sure what to suggest instead.
>
>
> Subclass:
>
> class Enclosing
> def go
> Hello.new.do_say_hello
> end
>
> def say_hello
> "Hello World!"
> end
>
> class Hello < Enclosing
> def do_say_hello
> puts say_hello
> end
> end
>
> end
>
> Enclosing.new.go
>
>
> # Module
>
> module Enclosing
> def go
> Hello.new.do_say_hello
> end
>
> def say_hello
> "Hello World!"
> end
>
> class Hello
> include Enclosing
> def do_say_hello
> puts say_hello
> end
> end
>
> end
>
> Enclosing::Hello.new.go

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

Ilan Berci

1/31/2008 10:34:00 PM

0

Richard Everhart wrote:
> I need to do something like what is being attempted in the code below.
>
> The commented out code is what I can't figure out: how do methods in a
> nested classes call methods in their enclosing class? Is this even
> possible?
>
> class Enclosing
> def go
> Hello.new.do_say_hello
> end
>
> def say_hello
> "Hello World!"
> end
>
> class Hello
> def do_say_hello
> # puts Enclosing class's say_hello method
> end
> end
>
> end

Not to fear, I have used similar stuff in other languages .. I believe
what you are looking for is delegates:

http://www.ruby-doc.org/stdlib/libdoc/delegate/rdoc/...

hth

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

Phrogz

1/31/2008 11:00:00 PM

0

On Jan 31, 3:23 pm, Richard Everhart <rich.everh...@gmail.com> wrote:
> Thanks for the reply.
>
> I wanted to add functionality to the enclosing class via the addition of
> the enclosed class with minimal changes to the enclosing class and its
> methods. Specifically, the enclosed class is intended to subclass a
> threading framework class and, after instantiated, call methods on the
> enclosing class. The enclosing class already extends another class.

class Foo
def yay
puts "foo sez yay"
end
# Creates a Foo::Bar class that is a subclass of Foo
class Bar < Foo
def yay
puts "bar sez yay"
super
puts "bar iz done"
end
end
end

Foo::Bar.new.yay
#=> bar sez yay
#=> foo sez yay
#=> bar iz done