次のShape階層があります。
public abstract class Shape
{ ... }
public class Rectangle : Shape
{ ... }
public class Circle : Shape
{ ... }
public class Triangle : Shape
{ ... }
2つの形状が交差しているかどうかを判断するために、次の機能を実装しました。次の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
が、まだ問題があります。基本的に、一意の順序付けされていないパラメーターセットに基づいてオーバーロードを発生させたいと考えています(これは不可能であることがわかっているため、回避策を探してください)。