Обычно это признак плохого дизайна, если вам нужно явно переключать поведение в зависимости от типа объекта.Всякий раз, когда вы добавляете фигуру, вам придется обновлять все места, где вы используете эти переключатели на основе типов.
В этом случае вашими основными «оружием» являются полиморфизм и виртуальные функции.
В самом простом подходе у вас может быть метод на IShape, который создает редактор самостоятельно:
public interface IShape {
IShapeEditor CreateEditor();
}
public interface IShapeEditor {
void ShowDialog();
}
public class Square : IShape {
public IShapeEditor CreateEditor(){
return new SquareEditor(this);
}
}
public class Triangle: IShape {
public IShapeEditor CreateEditor(){
return new TriangleEditor(this);
}
}
public class Circle: IShape {
public IShapeEditor CreateEditor(){
return new CircleEditor(this);
}
}
В этом случае ваш метод Edit может выглядеть следующим образом:
public static void Edit(IShape shape)
{
shape.CreateEditor().ShowDialog();
}
Проблема этого подхода заключается в том, что вы, возможно, не хотите, чтобы форма знала о редакторе.Шаблон, который пытается решить эту проблему - это шаблон посетителя .
Использование шаблона посетителя может выглядеть следующим образом:
public interface IShapeVisitor {
void VisitSquare(Square s);
void VisitTriangle(Triangle t);
void VisitCircle(Circle c);
}
public interface IShape {
void Accept(IShapeVisitor visitor);
}
public class Square : IShape {
public void Accept(IShapeVisitor visitor){
visitor.VisitSquare(this);
}
}
public class Triangle: IShape {
public void Accept(IShapeVisitor visitor){
visitor.VisitTriangle(this);
}
}
public class Circle: IShape {
public void Accept(IShapeVisitor visitor){
visitor.VisitCircle(this);
}
}
Это базовая структура.Для редактора, который вы знаете, создайте посетителя следующим образом:
public class EditorCreationVisitor : IShapeVisitor{
IShapeEditor editor;
public void VisitSquare(Square s ){
editor = new SquareEditor(s);
}
public void VisitTriangle(Triangle t ){
editor = new TriangleEditor(t);
}
public void VisitCircle(Circle c ){
editor = new CircleEditor(c);
}
public IShapeEditor Editor {get{return editor;}}
}
Ваш метод редактирования будет выглядеть следующим образом:
public static void Edit(IShape shape)
{
var visitor = new EditorCreationVisitor();
shape.Accept(visitor);
var editor = visitor.Editor;
editor.ShowDialog();
}
Шаблон посетителей работает лучше всего, если число различныхтип фигуры довольно постоянен, но вы регулярно добавляете другое поведение.