__interface
Specyficzne dla firmy Microsoft
Interfejs języka Visual C++ może być zdefiniowany w następujący sposób:
Może dziedziczyć z zera lub więcej interfejsów podstawowych.
Nie może odziedziczyć po klasie bazowej.
Może zawierać tylko publiczne, czyste metody wirtualne.
Nie może zawierać konstruktorów, destruktorów lub operatorów.
Nie może zawierać metod statycznych.
Nie może zawierać elementów członkowskich danych; właściwości są dozwolone.
modifier __interface interface-name {interface-definition};
Uwagi
Class lub struct języka C++ mogą być implementowane przy użyciu tych reguł, ale __interface je wymusza.
Na przykład następująca definicja jest przykładem interfejsu:
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Aby uzyskać więcej informacji o interfejsach zarządzanych, zobacz klasa interfejsu.
Należy zauważyć, że nie trzeba jawnie wskazywać, że funkcje CommitX i get_X są czystymi funkcjami wirtualnymi.Równoważne deklaracja pierwszej funkcji:
virtual HRESULT CommitX() = 0;
__interface pociąga za sobą modyfikator novtable __declspec.
Przykład
Poniższy przykład pokazuje jak używać właściwości zadeklarowanych w interfejsie.
// 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);
}