Referring to method in enclosing class

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-forum.com/.

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

···

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

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-forum.com/\.

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/index.html

hth

ilan

···

--
Posted via http://www.ruby-forum.com/\.

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-forum.com/\.

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

···

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.