У меня есть следующий интерфейс Shape, который реализуется несколькими другими классами, такими как Rectangle, Circle, Triangle...
interface IShape{
bool IsColliding(IShape other);
}
Метод IsColliding должен проверять, сталкивается ли Shape с другим или нет, независимо от их конкретного типа. Однако каждая пара фигур (Rectangle/Rectangle, Rectangle/Circle, Circle/Triangle и т.д.) Имеет свою собственную реализацию для этой проверки столкновения.
Я пытаюсь найти хорошее решение для решения этой проблемы.
Наивным методом было бы переключить тип "другой" формы, чтобы вызвать правильную реализацию:
class Rectangle : IShape{
bool IsColliding(IShape other){
if(other is Rectangle){
return CollisionHandler.CheckRectangleVsRectangle(this,(Rectangle)other);
}else if(other is Circle){
return CollisionHandler.CheckRectangleVsCircle(this,(Circle)other);
} else
// etc ...
}
}
Но добавление новой формы означало бы модификацию метода в каждом производном классе для добавления нового случая.
Я также думал о вызове уникального статического метода, подобного этому:
static bool IsColliding(IShape shapeA, IShape shapeB);
Но даже если он централизует все, он удваивает количество тестов типа, и мне все равно придется добавлять новый случай в каждом "if" на первом уровне.
if(shapeA is Rectangle){
if(shapeB is Rectangle){
// Rectangle VS Rectangle
}else if(shapeB is Circle){
// Rectangle VS Circle
}else{
// etc ...
}
}else if(shapeA is Circle){
if(shapeB is Rectangle){
// Rectangle VS Circle
}else{
// etc ...
}
} // etc ...
Итак, как его лучше настроить?