With Ice you can pass objects by proxy, or by value. See my article Proxies in http://www.zeroc.com/newsletter/issue23.pdf for more details about proxies.
If you pass an object by proxy, you are providing the recipient of the proxy the means to execute methods on the Ice object referred to by that proxy.
Code:
interface Action
{
void doit();
};
interface Execute
{
void ex(Action* action);
};
In this case the Action object is passed by proxy to the ex operation in the Execute object. When "pass by proxy" is used, the Ice object itself does not go over the wire, only information used to make invocations on that Ice object (the identity, facet, and optionally location information).
If you pass an object by-value, then you are passing the object itself over the wire. In this case, assuming the object is abstract (that is, has operations) the recipient must provide an implementation of the object through an ObjectFactory.
Code:
interface Execute
{
void ex(Action action);
};
This this case Action is passed by value. The recipient must provide an implementation on this interface. There is no automatic way, and nor would it be safe to do so in any case, to pass the implementation of the object over the wire. In a strictly controlled environment you could do this yourself, however.