Модель делегирования предлагает альтернативный способ реализации серванта. При использовании этой модели вам не нужно наследовать ваш сервант от MyInterface. Вместо этого вы создаете класс, реализующий методы, объявленные в интерфейсе, но наследовать этот класс может от кого угодно.

Класс серванта, который генерируется компилятором idl2cpp, реализует все необходимые методы, в том числе и методы, объявленные в IDL-интерфейсе. Поскольку компилятор IDL, естественно, не знает, что должны выполнять эти функции, то интересно посмотреть, каким образом можно сгенерировать такой код. На самом деле нет ничего проще:

 

// IDL 

interface MyInterface 

{

void foo();

};


// C++

template class POA_MyInterface_tie : public POA_MyInterface

{

private:

T* _ptr;

public:

 POA_MyInterface_tie(T& arg) : _ptr(t) { … }

void foo() throw (CORBA::SystemException) { _ptr->foo(); }

 };

 

Этот template-класс просто определяет конструктор, которому в качестве параметра передают объект независимого класса, содержащего реальную реализацию метода foo(). Вот и все.

Модель делегирования может оказаться полезной, когда вы хотите по каким-то причинам иметь независимую от навязанной CORBA иерархию наследования. В C++, как в языке, поддерживающем множественное наследование, эта проблема стоит не так остро, вы всегда можете строить для сервантов двойную иерархию – одну свою, другую CORBA. В Java эта модель применяется чаще.