Программный интерфейс
Версия от 18:12, 28 декабря 2015; Андрей Чусов (обсуждение | вклад) (Новая страница: «Под программным интерфейсом, если не оговорено иное, понимаетс…»)
Под программным интерфейсом, если не оговорено иное, понимается набор число виртуальных функций, вызываемых над скрытым указателем на объект, либо согласно спецификации thiscall, либо (для обеспечения межъязыковой совместимости) stdcall с первым скрытым параметром - указателем на объект.
Пусть интерфейс определен как
struct IFace
{
virtual void Method() = 0;
};
Такой интерфейс связан с объектом, обычно получаемым через компонент фабрику-класса
IClassFactory$ refFactory = get(); //Экземпляр порождающего класса, полученный откуда-то
IFace& inst = refFactory->CreateInstance(/*Аргументы*/);
либо через точку входа, имеющую связывание в стиле C
/*Импортируемая откуда-то функция, связывание C*/
extern "C" void* /*dllimport*/ GetObject(/*параметры*/);
struct IFace
{
virtual void Method() = 0;
};
int main(int argc, char** argv)
{
IFace* object_ptr = (struct IFace*) GetObject(/*аргументы*/);
object_ptr->Method();
return 0;
}
либо предоставляется как параметр какой-либо функции
void caller(IFace* object_ptr)
{
object_ptr->Method();
}
Примеры вызовов на разных языках, отличных от C++
Для интерфейса IFace, определенного как
struct ICalculator
{
virtual int __stdcall Add(int A, int B) = 0;
//Спецификатор stdcall может отличаться для разных языков и компиляторов одного языка. В MSVC и GCC __stdcall задан.
};
Клиент на C.
/*Определение интерфейса на C, в котором нет понятия классов с методами:**/
struct ICalculator; /*Объявление*/
struct ICalculator_functionlist
{
int (__stdcall * Add)(struct IFace* pThis, int A, int B);
};
struct ICalculator
{
struct ICalculator_functionlist* pFunc;
};
int main(int argc, char** argv);
{
/*Получение экземпляра через точку входа*/
struct ICalculator* pInst = (struct ICalculator*) GetObject(/*аргументы*/);
/*Вызов*/
printf("%d", pInst->pFunc(pInst, 1, 2));
return 0;
}