У меня проблемы с концепцией интерфейсов, взаимодействующих с полиморфными типами (или даже полиморфными интерфейсами). Я разрабатываю на C # и буду признателен, чтобы ответы оставались близкими к этому определению, хотя я думаю, что это по-прежнему дает всем достаточно места, чтобы дать ответ.
В качестве примера, допустим, вы хочу сделать программу для раскрашивания вещей. Вы определяете интерфейс для актера, который рисует, и вы определяете интерфейс для объекта, который рисует. Кроме того, у вас есть некоторые объекты, которые можно рисовать более конкретным способом.
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 не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.
Так что мой вопрос действительно четырехкратный:
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 не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.
Так что мой вопрос действительно четырехкратный:
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 не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.
Так что мой вопрос действительно четырехкратный:
Так что мой вопрос действительно четырехкратный:
Так что мой вопрос действительно четырехкратный: