При разработке иерархии классов я использую абстрактный базовый класс, который объявляет различные методы, которые будут реализовывать производные классы. В некотором смысле базовый класс максимально приближен к интерфейсу, насколько это возможно в 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 ()
вернет указатель или ссылку, проблем не возникнет.