У меня тупой вопрос о дизайне c ++. Есть ли способ для одного класса иметь одинаковые имена методов (следовательно, один и тот же API) методов, найденных в нескольких классах?
Моя текущая ситуация такова, что у меня есть ситуация, когда у меня есть классы
struct A
{
void foo() { std::cout << "A::foo" << std::endl;}
void boo() { std::cout << "A::boo" << std::endl;}
};
struct B
{
void moo() { std::cout << "B::moo" << std::endl;}
void goo() { std::cout << "A::goo" << std::endl;}
};
.... imagine possibly more
Что мне действительно нужно, так это еще один класс, который действует как интерфейс для этих функций. Я мог бы неправильно истолковать как шаблон проектирования фасада для простого интерфейса, который скрывает сложность создания экземпляров классов выше, но все еще использует их тот же интерфейс.
struct C
{
void foo() { ... }
void boo() { ... }
void moo() { ... }
void goo() { ... }
};
Для небольшого числа методов, показанных выше, это возможно либо объявить структуры A и B, либо передать их в качестве параметров для структурирования C и вызвать методы A и B в C, но это неосуществимо, если A имеет 40 методов и B имеет 30 методов. Перераспределение 70 методов с одинаковыми именами в C для вызова базовых методов A и B выглядело избыточным без всякой причины, если бы я мог добиться большего.
Я подумал о втором решении использования базового класса
struct base
{
void foo() { }
void boo() { }
void moo() { }
void goo() { }
};
struct A : public base
{
void foo() { std::cout << "A::foo" << std::endl;}
void boo() { std::cout << "A::boo" << std::endl;}
};
struct B : public base
{
void moo() { std::cout << "B::moo" << std::endl;}
void goo() { std::cout << "A::goo" << std::endl;}
};
Чтобы попытаться использовать shared_ptr, который имеет все определения функций. * например 1016 *
std::shared_ptr<base> l_var;
l_var->foo();
l_var->boo();
l_var->moo();
l_var->goo();
Это все еще не совсем дает мне то, что я хочу, потому что половина методов определена в структуре A, а другая половина в структуре B.
Мне было интересно, если бы множественное наследование сработало бы, но в школе я слышал, что делать множественное наследование - плохая практика (отладка - это сложно?)
Есть мысли или рекомендации? По сути, проще управлять структурами A и B (и так далее, поскольку это собственный класс для целей абстракции). Но хотелось бы гибкости как-то вызывать их методы в какой-то обертке, где эта сложность скрыта от пользователя.