Программный интерфейс

Материал из CAMaaS preliminary wiki
Версия от 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;
}