У меня возникают проблемы с концепцией взаимодействия интерфейсов с полиморфными типами (или даже с полиморфными интерфейсами). Я развиваюсь на С# и буду благодарен за ответы, стоящие рядом с этим определением, хотя я думаю, что все еще дает достаточно места, чтобы каждый мог ответить.
Как пример, скажем, вы хотите сделать программу для рисования вещей. Вы определяете интерфейс для актера, который является Красками, и вы определяете интерфейс для объекта, который окрашен. Кроме того, у вас есть некоторые предметы, которые можно раскрасить более определенным образом.
interface IPainter {
void paint(IPaintable paintable);
}
interface IPaintable {
void ApplyBaseLayer(Color c);
}
interface IDecalPaintable : IPaintable {
void ApplyDecal(HatchBrush b);
}
Я могу представить, как сделать живописец похожим на следующее:
class AwesomeDecalPainter : IPainter
{
public void paint(IPaintable paintable) {
IDecalPaintable decalPaintable = (IDecalPaintable)paintable;
decalPaintable.ApplyBaseLayer(Color.Red);
decalPaintable.ApplyDecal(new HatchBrush(HatchStyle.Plaid, Color.Green));
}
}
Конечно, это будет бросать, если paintable не реализует IDecalPaintable. Он сразу же вводит связь между реализацией IPainter и IPaintable, на которой он работает. Однако я также не думаю, что имеет смысл сказать, что AwesomeDecalPainter не является IP-узлом только потому, что он используется только подмножеством домена IPaintable.
Итак, мой вопрос действительно четыре раза:
- Совместимы ли интерфейсы с полиморфизм вообще?
- Это хорошо дизайн для внедрения IP-интерфейса, который может работать на IDecalPaintable?
- Как насчет того, может ли он работать исключительно на IDecalPaintable?
- Есть ли какая-либо литература или исходный код, который иллюстрирует, как интерфейсы и полиморфные типы должны взаимодействовать?