[rjb-users] Extending a Java class

rjb-users at rubyforge.org rjb-users at rubyforge.org
Wed Nov 1 12:00:45 EST 2006


Hi, Rich,

This is the case what really class inheritance is required.

I suppose that the method_missing error was occured for calling
Util#doSomething(Foo foo), because your FakeFoo is not a subclass of Foo,
so Rjb searched a method Util#doSomething(Object), and then it threw the
exception because the method was missing. 

At this time, the best solution is to define an interface, because Rjb
can bind the interface with Ruby class.
But I know that is useless for the existing methods like
Utli#doSomething(Foo foo).

On Wed, 1 Nov 2006 07:17:47 -0800 (PST)
rjb-users at rubyforge.orgさん wrote:

> Hi Arton,
> 
> The delegation idea is nice. I gave it a try and it
> worked. Now I have a more difficult question.
> 
> Here's a situation I'd like to get working. I have a
> Java library. A class has a static method that takes
> an argument of type Foo:
> 
> public class Foo
> {
>   //...
> 
>   public void bar()
>   {
>     //...
>   }
> }
> 
> and....
> 
> package my.lib;
> 
> public class Util
> {
>   //...
> 
>   public static void doSomething(Foo foo)
>   {
>     // use F
>   }
> }
> 
> In Ruby, I would like to create a pure Ruby class that
> works like the Java class Foo:
> 
> class FakeFoo
> 
>   #...
> 
>   def bar
>     #implement
>   end
> end
> 
> I'd like to be able to do this:
> 
> require 'rjb'
> 
> Util=Rjb::import 'my.lib.Util'
> 
> ff=FakeFoo.new
> 
> Util.doSomething(ff)
> 
> When I try this now, I get a method_missing error. But
> what is the method that's missing? What can I do to
> FakeFoo to make it work with the Util.doSomething
> method?
> 
> cheers,
> Rich
> 
> --- arton <arton at e07.itscom.net> wrote:
> 
> > Hi Rich,
> > 
> > At this time, the imported class is not a really
> > Ruby class in Rjb.
> > If you think it's better to map imported class as
> > Ruby's class, I positively
> > plan to implement the feature.
> > So, at this time, a workaround is to use delegation
> > instead of
> > inheritance.
> > This sample code describes how to delegate method
> > calls to the contained
> > object.
> > 
> > require 'rjb'
> > require 'test/unit'
> > 
> > class RubyVector
> >   Vector = Rjb::import('java.util.Vector')
> >   def initialize
> >     @vector = Vector.new
> >   end
> >   def test_vector
> >     'it worked'
> >   end
> >   def method_missing(msg, *arg)
> >     @vector.send(msg, *arg)
> >   end
> > end
> > 
> > class VectorTest < Test::Unit::TestCase
> > 
> >   def setup
> >     @r = RubyVector.new
> >   end
> > 
> >   def test_adding_method()
> >     assert_equal('it worked', @r.test_vector)
> >   end
> > 
> >   def test_add()
> >     @r.add(1)
> >     @r.add(2)
> >     @r.add(3)
> >     assert(@r.contains(1))
> >     assert(!@r.contains(8))
> >   end
> > 
> >   def test_get()
> >     @r.add("ab")
> >     @r.add("cd")
> >     @r.add("ef")
> >     assert_equal("ab", @r.get(0).toString)
> >     assert_equal("cd", @r.get(1).toString)
> >     assert_equal("ef", @r.get(2).toString)
> >   end
> > 
> >   def test_iterator()
> >     @r.add("ab")
> >     @r.add("cd")
> >     @r.add("ef")
> >     i = @r.iterator
> >     assert(i.hasNext)
> >     assert_equal("ab", i.next.toString)
> >     assert(i.hasNext)
> >     assert_equal("cd", i.next.toString)
> >     assert(i.hasNext)
> >     assert_equal("ef", i.next.toString)
> >     assert(!i.hasNext)
> >   end
> > end
> > 
> > Best reagrds
> > 
> > On Mon, 30 Oct 2006 22:07:02 -0800 (PST)
> > richard apodaca <rich_apodaca at yahoo.com>、オ、s wrote:
> > 
> > > Hi Arton,
> > > 
> > > I was wondering how to extend a Java class with
> > RJB. I
> > > saw in the documentation how to bind a Java
> > interface
> > > to a Ruby class, but can I extend a Java class
> > with
> > > Ruby? Here's an example of what I've tried:
> > > 
> > > require 'rubygems'
> > > require_gem 'rjb'
> > > require 'rjb'
> > > 
> > > Vector=Rjb::import 'java.util.Vector'
> > > 
> > > class Test < Vector.class
> > >   def initialize
> > >   end
> > >   def test_vector
> > >     puts "it worked"
> > >   end
> > > end
> > > 
> > > t=Test.new # => TypeError: allocator undefined for
> > > Test
> > > 
> > > I get a TypeError with the above code. If I try to
> > > extend directly form Vector rather than
> > Vector.class,
> > > I get:
> > > 
> > > TypeError: superclass must be a Class
> > > 
> > > Any ideas?
> > > 
> > > thanks,
> > > Rich
> > > 
> > > 
> > > ____________________________
> > > Richard Apodaca
> > > Blog: http://depth-first.com
> > > 
> > > 
> > >  
> > >
> >
> ____________________________________________________________________________________
> > > Want to start your own business? Learn how on
> > Yahoo! Small Business 
> > > (http://smallbusiness.yahoo.com) 
> > > 
> > 
> > -- 
> > arton
> > 
> > 
> 
> 
> ____________________________
> Richard Apodaca
> Blog: http://depth-first.com
> 
> ____________________________
> Richard Apodaca
> Blog: http://depth-first.com
> 
> 
>  
> ____________________________________________________________________________________
> We have the perfect Group for you. Check out the handy changes to Yahoo! Groups 
> (http://groups.yahoo.com)
> 
> _______________________________________________
> rjb-users mailing list
> rjb-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rjb-users

-- 
arton



More information about the rjb-users mailing list