我有以下形状层次结构:
public abstract class Shape
{ ... }
public class Rectangle : Shape
{ ... }
public class Circle : Shape
{ ... }
public class Triangle : Shape
{ ... }
我已经实现了以下功能来确定两个形状是否相交。我使用以下IsOverlapping
扩展方法,它用于在运行时dynamic
调用适当的重载IsOverlappingSpecialisation
方法。我相信这被称为双重调度。
static class ShapeActions
{
public static bool IsOverlapping(this Shape shape1, Shape shape2)
{
return IsOverlappingSpecialisation(shape1 as dynamic, shape2 as dynamic);
}
private static bool IsOverlappingSpecialisation(Rectangle rect, Circle circle)
{
// Do specialised geometry
return true;
}
private static bool IsOverlappingSpecialisation(Rectangle rect, Triangle triangle)
{
// Do specialised geometry
return true;
}
这意味着我可以执行以下操作:
Shape rect = new Rectangle();
Shape circle = new Circle();
bool isOverlap = rect.IsOverlapping(circle);
我现在面临的问题是,我还必须实施以下ShapeActions
工作circle.IsOverlapping(rect)
:
private static bool IsOverlappingSpecialisation(Circle circle, Rectangle rect)
{
// The same geometry maths is used here
return IsOverlappingSpecialisation(rect, circle);
}
这是多余的(因为我需要为每个创建的新形状执行此操作)。有没有办法解决这个问题?我想过将Tuple
参数传递给IsOverlapping
,但我仍然有问题。本质上,我希望基于唯一的无序参数集发生重载(我知道这是不可能的,所以寻找解决方法)。