__interface
Específicos de Microsoft
Una interfaz de Microsoft C++ se puede definir de la manera siguiente:
Puede heredar de cero o más interfaces base.
No puede heredar de una clase base.
Solo puede contener métodos virtuales puros, públicos.
No puede contener constructores, destructores ni operadores.
No puede contener métodos estáticos.
No puede contener miembros de datos; se permiten las propiedades.
Sintaxis
modifier __interface interface-name {interface-definition};
Comentarios
Una clase o estructura de C++ se podría implementar con estas reglas, pero __interface
las exige.
Por ejemplo, este es un ejemplo de definición de interfaz:
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Para obtener información sobre interfaces administradas, consulte la clase de interfaz.
Observe que no tiene que indicar explícitamente que las funciones CommitX
y get_X
son virtuales puras. Una declaración equivalente para la primera función sería:
virtual HRESULT CommitX() = 0;
__interface
implica el modificador novtable__declspec
.
Ejemplo
En el ejemplo siguiente se muestra cómo utilizar propiedades declaradas en una interfaz.
// 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);
}
p->int_data = 100
bstr_data = Testing
FIN de Específicos de Microsoft
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de