moving from interface class to implementation class
Sai-Lai Lo
S.Lo@orl.co.uk
Thu, 16 Oct 1997 11:21:10 +0100
>>>>> Bernd Daum writes:
> Example:
> IDL:
> interface A {.....};
> C++:
> class A_i: virtual public _sk_A {};
> If i have an object reference ('ref') for an A and
> want to get an pointer ('p') for the implementation
> object, i usually use the C++ dynamic cast:
> A_ptr ref;
> A_i* p = dynamic_cast<A_i*>(ref);
In this example code, you have made the assumption that the object
reference A_ptr is a base class of the implementation skeleton _sk_A. This
is not a behaviour mandated by the CORBA spec. In fact, the Portable Object
Adaptor (POA) spec. says:
18.2.1
"In several existing ORB implementations, each skeleton class derives from
the corresponding interface class. ... These systems therefore allow an
object reference for a servant to be implicitly obtained via normal C++
derived-to-base conversion rules:
MyImplOfA my_a;
A_ptr a = &my_a;
Such code can be supported by a conforming ORB implementation, but it is
not required, and is thus not portable. The equivalent portable code invokes
^^^^^^^^^^^^^^^^^^^^
_this() on the implementation object.."
Also, I'm not sure there is a portable way to get back to the implemntation
from the object reference.
With omniORB, the recommended way to obtain an object reference from an
implementation is using _this() which is a member function of the
implementation skeleton. The function returns an object reference which you
must call CORBA::release() to deallocate.
Coming back to your question, it is better to avoid making this assumption
and not to use dynamic_cast or any other means to get back to the
implementation class from an object reference.
I should also say that in future, the internal structure of the stub may
change such that it is not possible to use C++ derived-to-base conversion
rule to obtain an object reference from an implementation. To ensure smooth
transition, it is important to avoid making this assumption and
*******always use _this()******* to obtain the object reference.
Regards,
Sai-Lai