1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!--Converted with LaTeX2HTML 2002-2-1 (1.70)
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Interfaces and Abstract Classes</TITLE>
<META NAME="description" CONTENT="Interfaces and Abstract Classes">
<META NAME="keywords" CONTENT="users_guide">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="LaTeX2HTML v2002-2-1">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<LINK REL="STYLESHEET" HREF="users_guide.css">
<LINK REL="next" HREF="node157.html">
<LINK REL="previous" HREF="node155.html">
<LINK REL="up" HREF="node148.html">
<LINK REL="next" HREF="node157.html">
</HEAD>
<BODY >
<DIV CLASS="navigation"><!--Navigation Panel-->
<A NAME="tex2html3039"
HREF="node157.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html3033"
HREF="node148.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html3027"
HREF="node155.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html3035"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html3037"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html3040"
HREF="node157.html">Exceptions</A>
<B> Up:</B> <A NAME="tex2html3034"
HREF="node148.html">Java Bindings</A>
<B> Previous:</B> <A NAME="tex2html3028"
HREF="node155.html">Using SIDL arrays with</A>
<B> <A NAME="tex2html3036"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html3038"
HREF="node317.html">Index</A></B>
<BR>
<BR></DIV>
<!--End of Navigation Panel-->
<H1><A NAME="SECTION03580000000000000000"></A>
<A NAME="9145"></A>
<BR>
Interfaces and Abstract Classes
</H1>
<P>
Babel implements SIDL interfaces as Java interfaces in Java.
This is a close mapping in general, but it does have the problem that
Java interfaces can't hold data. Since we need the correct IOR
pointer in order to place that interface in an array or throw it as an
Exception, the lack of data becomes a problem. For this reason, we
have created Wrapper classes for interfaces and abstract classes.
<P>
All interfaces and abstract classes have static inner class named
<TT>Wrapper</TT>. This <TT>Wrapper</TT> class holds the interface IOR
pointer, and also inherits from <TT>gov.llnl.babel.BaseClass</TT> and implements the
outer interface. Therefore, you can call all the interface methods on
the wrapper object, as well as <TT>gov.llnl.babel.BaseClass</TT> methods such as
<TT>_cast2</TT>, and <TT>isType</TT>.
<P>
This wrapper class is what is returned when an interface is gotten out
of an array, a method takes or returns an interface, or when an exception implemented as an interface is
caught.
(There's actually a difference here. While what is gotten
out of the Array or returned from a method is a Wrapper object, the programmer doesn't usually need to worry about that, as is shown in the example below. In the case of
exceptions, you actually do have to catch the Wrapper. Exceptions are
covered in more detail in Subsection <A HREF="node157.html#ss:Exc">10.9</A>) Because wrapper
classes inherit only from an interface, they
can be java casted to their enclosing interface, or it's
super-interfaces, but must be Babel casted to any classes. In this
example, Subclass implements Super-Interface:
<P>
<BR>
<PRE CLASS="verbatim">SuperInterface.Array1 arry = new SuperInterface.Array1(5, true);
SubClass obj = new SubClass();
arry.set(0, (SuperInterface)obj);
obj = null;
SuperInterface temp = arry.get(0);
obj = (SubClass) temp; //INCORRECT Will throw ClassCastException
obj = (SubClass) SubClass._cast((SuperInterface.Wrapper)temp); //CORRECT
</PRE></td></tr></table></blockquote>
<P>
Sometimes you can get away with not Java casting the interface to the
Wrapper class before Babel casting it, but not in general. (Usually
you don't have to when the interface was gotten out of an array)
<P>
Here's an example of casting an interface on the server side:
<P>
<BR>
<PRE CLASS="verbatim">
public objarg.SubClass toClass_Impl (/*in*/ objarg.Iface ifcy ) {
// DO-NOT-DELETE splicer.begin(objarg.SubClass.toClass)
objarg.SubClass ret = (objarg.SubClass)
((objarg.Iface.Wrapper)ifcy)._cast2("objarg.SubClass");
return ret;
// DO-NOT-DELETE splicer.end(objarg.SubClass.toClass)
}
</PRE></td></tr></table></blockquote>
<P>
<DIV CLASS="navigation"><HR>
<!--Navigation Panel-->
<A NAME="tex2html3039"
HREF="node157.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html3033"
HREF="node148.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html3027"
HREF="node155.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html3035"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html3037"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html3040"
HREF="node157.html">Exceptions</A>
<B> Up:</B> <A NAME="tex2html3034"
HREF="node148.html">Java Bindings</A>
<B> Previous:</B> <A NAME="tex2html3028"
HREF="node155.html">Using SIDL arrays with</A>
<B> <A NAME="tex2html3036"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html3038"
HREF="node317.html">Index</A></B> </DIV>
<!--End of Navigation Panel-->
<ADDRESS>
<br><br>babel-0.10.2<br>users_guide Last Modified 2005-03-23<br><br><a href="http://www.llnl.gov/CASC/components">http://www.llnl.gov/CASC/components</a><br><a href="mailto:components@llnl.gov">components@llnl.gov</a>
</ADDRESS>
</BODY>
</HTML>
|