Семантика — передача реализованного интерфейса в методы

Рассмотрим следующий интерфейс:

class MyInterface
{
virtual bool test(void * param) = 0;
}

Может ли что-то подобное сделать для реализации интерфейса?

MyInterfacemyInterface = new MyInterface()
{
bool test(void * param)
{
return true;
}
}

myClass.setInterface(myInterface);

----- OR -----

myClass.setInterface( new MyInterface()
{
bool test(void * param)
{
return true;
}
} );

PS: этот метод сделан на Java. Интересно, что-то подобное существует в C ++.

4

Решение

Самая близкая вещь, которую вы можете получить к Java-эквиваленту встроенной реализации интерфейса, — это поместить приватный класс в ваш модуль компиляции:

#include "MyInterface.hpp"
namespace {
struct MyInterfaceImpl : public MyInterface {
virtual bool test(void * param)
{
return true;
}
};
}

И используйте его в другом месте этого файла (например, из локальных экземпляров стека).

2

Другие решения

Большую часть времени такой шаблон используется в Java для обработки событий / обратных вызовов. Если он близок к вашему варианту использования, рассмотрите что-то вроде этого:

class Widget {
std::function<void()> _callback;

void setCallback(std::function<void()> callback) { _callback = callback; }

void fireCallback() { if(_callback) _callback(); }
}

А в галактике далеко-далеко

int main() {

Widget *pw = new Widget();

auto callbackFunction = []() { alert("called back!"); } // C++ lambda

pw->setCallback( callbackFunction );
....
}

При необходимости этот экземпляр Widget может решить вызвать свой метод fireCallback, и вы увидите предупреждение («перезвонил!») На вашем экране.

2

Я предполагаю, что вы хотите сделать что-то похожее на то, что делается в Java, и создать какой-то анонимный класс, который используется только в одном месте.

Это не возможно в C ++ так же, как в Java.
Нечто похожее, что вы могли бы сделать, — это заставить ваш «интерфейс» (хотя он больше не будет таковым) использовать лямбды, которые указываются в момент, когда вы создаете экземпляр класса. Это не совсем то, что вы ищете, и не очень идиоматический C ++, но это можно сделать.

1

Строго говоря, в C ++ такой семантики нет. Если вы хотите передать интерфейс функции, вы берете указатель или ссылку на нее в качестве параметра и реализуете интерфейс в отдельном классе.

У вас будет одна из следующих функций-членов (после ваших имен)

myClass::setInterface(MyInterface* ptr);
//or
myClass::setInterface(MyInterface& ref);

а затем реализация

class MyInterfaceImpl : public MyInterface{
//Stuff
}

Затем вы можете передать указатель на MyInterfaceImpl в setInterface, но вы не можете определить реализацию на лету и передать это таким образом в функцию.

РЕДАКТИРОВАТЬ: Если вы хотите что-то близкое к этому поведению, рассмотрите вариант ответа πάντα ῥεῖ или реализуйте класс непосредственно перед созданием экземпляра и передачей его функции, хотя это довольно необычно в моем опыте и загромождает код определением локального класса)

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector