Say У меня есть иерархия классов, давайте использовать классические Shape
примеры:Расширение обе стороны шаблона Visitor/Bridge
abstract class Shape
Circle : Shape
Square : Shape
У меня есть вторая иерархия классов визуализатора которые обрабатывают визуализацию фигур по-разному:
abstract class ShapeRenderer
HtmlShapeRenderer : ShapeRenderer
WindowsFormsShapeRenderer : ShapeRenderer
Разрешение на их изменение независимо традиционно предполагает использование шаблона Bridge. Разрешить продление действия рендеринга без изменения классов Shape
традиционно будет включать шаблон посетителя.
Тем не менее, обе эти цели направлены исключительно на расширение стороны реализации, а не на сторону абстракции. Скажем, я хотел добавить новый Shape
, скажем Triangle
. Я хочу, чтобы поддерживать рендеринг Triangle
. Так как посетителей и модель моста полагаться на «уплощение» иерархии абстракции в набор методов, например:
public abstract class ShapeRenderer
{
public abstract void RenderCircle(Circle c);
public abstract void RenderSquare(Square s);
}
Единственный способ продлить Shape
иерархии, чтобы изменить код базового класса ShapeRenderer
, что является нарушением изменений.
Jon, чтобы уточнить: использование Bridge или Visitor позволяет клиентам предоставлять альтернативные реализации рендеринга, но требует, чтобы они знали обо всех потенциальных фигурах. То, что я хотел бы сделать, это разрешить клиентам также, чтобы расширить класс Shape
и требуют, чтобы обеспечить реализацию рендеринга для своего нового класса. Таким образом, существующий код может работать с любым типом Shape
, не беспокоясь о деталях их рендеринга.
Есть ли общее решение для такого рода проблем, используемых в C#?
Но мы все хотим волшебства! [абсолютная инкапсуляция и т. д. :)] – mlvljr 2010-03-20 21:10:27