Возвращение абстрактного типа в базовом классе

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

10
задан Zeenobit 28 October 2011 в 00:36
поделиться