Как решить проблему с классами и ввести как минимум максимально возможный код? Вот что у меня естьРазработка классов с виртуальными методами
Базовый интерфейс для всего
class IWindow
{
public:
virtual void Refresh() = 0;
// another 100 virtual methods
// ...
};
Этот интерфейс используется внутри библиотеки, которая не имеет ни малейшего представления о конкретной реализации.
Вот версия конкретной реализации
class ConcreteWindow : public IWindow
{
public:
void Refresh() override {}
/// the other 100 overridden methods
};
Теперь у нас есть еще один интерфейс, который добавляет некоторые дополнительные методы, а также используется в этой библиотеке.
class IDBDetail : public IWindow
{
public:
virtual void DoDetail() = 0;
};
и вот главная проблема, когда мы создаем конкретную inmplementation для него
class IGDBDetailWrapper : public IDBDetail, public ConcreteWindow
{
public :
void DoDetail() {}
};
конечно конкретный класс IGDBDetailWrapper
является абстрактным, а потому, что он не выполняет эти 100 способов, но Я не хочу этого делать, я бы хотел просто повторно использовать реализацию от ConcreteWindow
, все они работают с одним и тем же дескриптором окна, но это, конечно же, не будет компилироваться.
Я могу скопировать/вставить эти 100 методов из ConcreteWindow
в IGDBDetailWrapper
, но это перебор, потому что у меня могут быть еще 10 таких новых интерфейсов и конкретных реализаций.
Какой еще шаблон можно использовать здесь, чтобы помочь решить вопрос, а не повторять эти 100 методов снова и снова?
Thx
вы просто делаете это неправильно. Чистый интерфейс становится довольно утомительным, когда у него больше нескольких функций. Но хуже, гораздо хуже, его очень сложно отлаживать. Просто не надо, «окно» нуждается в базовом классе, чтобы быть практичным. Не забудьте посмотреть, как это делали другие люди, много и много библиотек обложек GUI. –
Почему бы просто не наследовать от ConcreteWindow? –
Это просто плохой дизайн библиотеки, потому что 100 методов в базовом классе ужасны, а отношения наследования между 'IDBDetail' и' IWindow' выглядят неправильно. Вы не найдете чистого решения; любой клиент этой библиотеки должен будет использовать одно обходное решение или другое. –