__interface
Блок, относящийся только к системам Microsoft
Интерфейс Visual C++ можно определить следующим образом:
Может наследовать от произвольного (включая 0) числа базовых интерфейсов.
Не может наследовать от базового класса.
Может содержать только открытые, чисто виртуальные методы.
Не может содержать конструкторы, деструкторы или операторы.
Не может содержать статические методы.
Не может содержать члены данных; свойства допускаются.
modifier __interface interface-name {interface-definition};
Заметки
class или struct C++ могут быть реализованы с учетом этих правил, но __interface обеспечивает их принудительное применение.
Например, ниже приведен пример определения интерфейса:
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Дополнительные сведения об управляемых интерфейсах см. в разделе interface class.
Обратите внимание — нет необходимости явно указывать, что функции CommitX и get_X являются чистой виртуальными. Эквивалентное объявление для первой функции могло бы быть следующим:
virtual HRESULT CommitX() = 0;
__interface подразумевает модификатор novtable __declspec.
Пример
В следующем примере показано, как использовать свойства, объявленные в интерфейсе.
// deriv_interface.cpp
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>
#include <string.h>
#include <comdef.h>
#include <stdio.h>
[module(name="test")];
[ object, uuid("00000000-0000-0000-0000-000000000001"), library_block ]
__interface IFace {
[ id(0) ] int int_data;
[ id(5) ] BSTR bstr_data;
};
[ coclass, uuid("00000000-0000-0000-0000-000000000002") ]
class MyClass : public IFace {
private:
int m_i;
BSTR m_bstr;
public:
MyClass()
{
m_i = 0;
m_bstr = 0;
}
~MyClass()
{
if (m_bstr)
::SysFreeString(m_bstr);
}
int get_int_data()
{
return m_i;
}
void put_int_data(int _i)
{
m_i = _i;
}
BSTR get_bstr_data()
{
BSTR bstr = ::SysAllocString(m_bstr);
return bstr;
}
void put_bstr_data(BSTR bstr)
{
if (m_bstr)
::SysFreeString(m_bstr);
m_bstr = ::SysAllocString(bstr);
}
};
int main()
{
_bstr_t bstr("Testing");
CoInitialize(NULL);
CComObject<MyClass>* p;
CComObject<MyClass>::CreateInstance(&p);
p->int_data = 100;
printf_s("p->int_data = %d\n", p->int_data);
p->bstr_data = bstr;
printf_s("bstr_data = %S\n", p->bstr_data);
}