В дизайне иерархии классов я использую абстрактный базовый класс, который объявляет различные методы, которые будут реализовывать производные классы. В каком-то смысле базовый класс близок к интерфейсу, который вы можете получить на С++. Однако существует определенная проблема. Рассмотрим приведенный ниже код, который объявляет наш класс интерфейса:
class Interface {
public:
virtual Interface method() = 0;
};
class Implementation : public Interface {
public:
virtual Implementation method() { /* ... */ }
};
Конечно, это не скомпилируется, потому что вы не можете вернуть абстрактный класс в С++. Чтобы обойти эту проблему, я использую следующее решение:
template <class T>
class Interface {
public:
virtual T method() = 0;
};
class Implementation : public Interface<Implementation> {
public:
virtual Implementation method() { /* ... */ }
};
Это решение работает, но для меня все в порядке и dandy, оно выглядит не очень элегантно из-за избыточного текста, который будет параметром для интерфейса. Я был бы счастлив, если бы вы, ребята, могли указать на наши другие технические проблемы с этим дизайном, но это моя единственная проблема на данный момент.
Есть ли способ избавиться от этого избыточного параметра шаблона? Возможно использование макросов?
Примечание. Этот метод должен возвращать экземпляр. Я знаю, что если method()
вернул указатель или ссылку, не было бы проблем.