Скажем, у меня есть иерархия классов, давайте использовать классические Shape
примеры:
abstract class Shape
Circle : Shape
Square : Shape
У меня есть вторая иерархия классов визуализации, которые по-разному обрабатывают рендеринг фигур:
abstract class ShapeRenderer
HtmlShapeRenderer : ShapeRenderer
WindowsFormsShapeRenderer : ShapeRenderer
Разрешение их варьирования независимо обычно предполагает использование шаблона Мост. Разрешение действия рендеринга без изменения классов Shape
традиционно включает шаблон Visitor.
Однако оба они сосредоточены исключительно на расширении стороны реализации, а не стороны абстракции. Скажем, я хотел добавить новый Shape
, скажем Triangle
- я хочу иметь возможность поддерживать рендеринг Triangle
. Поскольку и шаблон «Посетитель» и «Мост» полагаются на «уплощение» иерархии абстракций в набор методов, например ::
public abstract class ShapeRenderer
{
public abstract void RenderCircle(Circle c);
public abstract void RenderSquare(Square s);
}
Единственный способ расширить иерархию Shape
- это изменить код базового класса ShapeRenderer
, что является серьезным изменением.
Джон, чтобы уточнить: Использование Bridge или Visitor позволяет клиентам предоставлять альтернативные реализации рендеринга, но требует, чтобы они знали обо всех потенциальных Shapes. То, что я хотел бы сделать, это позволить клиентам также иметь возможность расширять класс Shape
, а требовать от них для обеспечения реализации рендеринга для их нового класса. Таким образом, существующий код может работать с любым типом Shape
, не беспокоясь об особенностях их рендеринга.
Есть ли общее решение проблемы такого рода, которое можно использовать в C #?