我有一个不同的Line
类的继承树,从抽象Line
-classes开始。我希望能够将每一行与每一行相交,有时候,我也不知道任何运行时类型,例如,我打电话Line.Intersect(Line)
(所以我需要双重调度)。这将总是调用被覆盖的最为抽象的过载 - 方法,例如, Circle.Intersect(Line)
而不是Circle.Intersect(actualType)
。下面是一些示例代码:单个继承树内的双派遣
class Program
{
static void Main(string[] args)
{
Line straightLine = new StraightLine();
Line circle = new Circle();
// Will print: "Circle intersecting a line."
// But should print: "Circle intersecting a straight line."
circle.Intersect(straightLine);
Console.ReadLine();
}
}
abstract class Line
{
public abstract void Intersect(Line line);
public abstract void Intersect(StraightLine straightLine);
public abstract void Intersect(Circle circle);
}
class StraightLine : Line
{
public override void Intersect(Line line)
{
Console.WriteLine("Straigth line intersecting a line.");
}
public override void Intersect(StraightLine straightLine)
{
Console.WriteLine("Straight line intersecting a straight line.");
}
public override void Intersect(Circle circle)
{
Console.WriteLine("Straight line intersecting a circle.");
}
}
class Circle : Line
{
public override void Intersect(Line line)
{
Console.WriteLine("Circle intersecting a line.");
}
public override void Intersect(Circle circle)
{
Console.WriteLine("Circle intersecting a circle.");
}
public override void Intersect(StraightLine straightLine)
{
Console.WriteLine("Circle intersecting a straight line.");
}
}
一个可能的解决方法是使用dynamic
,这是我目前做的。但是,我想迁移到.NET标准库,其中dynamic
不允许。
还有其他方法可以使这项工作?如果有帮助,我愿意将抽象类切换为一个或多个接口。也许访问者模式是适用的,虽然我只看到它用于不同的继承树(并发现它很难看)。