J'ai un arbre d'héritage de classes Line
différentes, commençant par le Line
-classe. Je veux être capable de croiser chaque ligne avec chaque autre ligne, et parfois, je ne connais aucun des types d'exécution, par ex. J'appelle Line.Intersect(Line)
(donc j'ai besoin de double expédition). Cela appellera toujours la surcharge la plus abstraite de la méthode Intersect
surchargée, par ex. Circle.Intersect(Line)
au lieu de Circle.Intersect(actualType)
. Voici quelques exemples de code:Envoi double à l'intérieur d'un seul arbre d'héritage
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.");
}
}
Une solution possible est d'utiliser dynamic
, que je fais actuellement. Cependant, je souhaite migrer vers une bibliothèque .NET Standard, où dynamic
n'est pas autorisé.
Existe-t-il d'autres façons de faire ce travail? Je serais prêt à changer la classe abstraite pour une ou plusieurs interfaces, si cela aide. Peut-être que le modèle de visiteur est applicable, bien que je l'ai seulement vu utilisé pour différents arbres d'héritage (et le trouve assez moche).