So what do we need Java classes for in a JRuby/Ruby.Net environment?
Things that we have to new
because that defines system services in an unambiguous fashion — I'm thinking encodings for I/O and GUI components here, as well as libraries already written that we don't want to port just yet (my algorithms library); and interfaces/abstract classes we want to make concrete (needing to be an ActionListener or similar).
Concrete things are easy; abstractions are trickier, but not impossible.
//C# code to generate a Ruby class type public static Ruby.Class getThing() { object o = new java.awt.Panel(); return Ruby.Class.CLASS_OF(o); }
##Ruby code to use it thing = JsharpToRuby::ClassDictionary.getThing puts thing.to_s puts thing.ancestors panel = thing.new puts panel.to_s
which generates
Panel Container Component Serializable MenuContainer ImageObserver Object Object Kernel java.awt.Panel[panel1,0,0,0x0,invalid,layout=java.awt.FlowLayout]
which goes … java.lang.Object, Ruby Object, …
So now try
io = nil thing.ancestors.each { |x| io = x if x.to_s.eql? "ImageObserver" } MyImageObserver = io class Observer include MyImageObserver def imageUpdate(img, infoflags, x, y, width, height) nil end end q = Observer.new puts q.class.ancestors
to get
Observer ImageObserver Object Kernel
which means the task is not immediately insuperable; but may need some hand-rolling of concrete classes for some of the interesting interfaces, rather than being something that can be totally read-only…
No comments:
Post a Comment