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