Вот пример класса с двойным интерфейсом:
class Pig {
public: // Интерфейс Eat() для поедания известных плодов
void Eat(Apple a);
void Eat(Banana b);
void Eat(Coco c);
public: // Интерфейс EatAnything() для поедания ВСЕГО
// Дублируем ннтерфейс Eat(), так как известные плоды мы умеем есть
void EatAnything(Apple a) { Eat(a); }
void EatAnything(Banana b) { Eat(b); }
void EatAnything(Coco c) { Eat(c); }
// Неизвестные плоды ...
// Например, так
void EatAnything(...) { }
// или так
template<typename T>
void EatAnything(T) { }
};
void main()
{
Apple a;
Coco c;
Tomato t;
Pig pig;
pig.Eat(a);
pig.Eat(c);
pig.Eat(t); // Compile error! Функции Eat(Tomato) в Pig нет
pig.EatAnything(a);
pig.EatAnything(c);
pig.EatAnything(t); // А здесь OK.
}
Вопрос. Как сделать интерфейс EatAnything() попроще, в две-три строчки, чтобы его не приходилось обновлять каждый раз при добавлении новых видов плодов?