Polymorphisme et delegate : comment définir une signature compatible
Salut,
Soit les classes de base Véhicule() et Moteur().
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Moteur{
public string Nom {get;set;}
}
public delegate void RouleHandler(Moteur moteur);
public class Vehicule
{
public string Nom {get;set;}
protected RouleHandler rouleHandler= null;
public void Roule(Moteur moteur)
{
if (null != this.rouleHandler)
{
Console.Write("La voiture " + Nom + "roule");
this.rouleHandler(moteur);
}
}
} |
Soit deux classes héritière de Véhicule : VehiculeAuto et VehiculeManuel (VehiculeManuel non représenté ici, mais sur le même schema que VehiculeAuto )
ainsi que les classe héritière de Moteur : MoteurAuto et MoteurManuel
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class MoteurAutomatique : Moteur
{
public int TypeDeBoiteAuto { get; set; }
public MoteurAutomatique()
{
this.TypeDeBoiteAuto = 4;
this.Nom = "Moteur auto";
}
public MoteurAutomatique(string nom, int typeDeBoiteAuto)
{
this.Nom = nom;
this.TypeDeBoiteAuto = typeDeBoiteAuto;
}
}
public class VehiculeAuto : Vehicule
{
private void RouleAuto(MoteurAutomatique moteurAuto)
{
//Fait quelque chose de spécifique au type moteurAuto en accédant par exemple à un attribu specifique
Console.WriteLine("avec une boite auto de type" + moteurAuto.TypeDeBoiteAuto.ToString());
}
public VehiculeAuto() {
this.rouleHandler = new RouleHandler(RouleAuto);
}
} |
Quand on appelle Roule() sur la classe de base Vehicule, on exécute un Handler définie dans les classes héritière, afin que chaque véhicule effectue un traitement adapté à son contexte.
L'intérêt, c'est qu'à haut niveau on a la même boucle, quelque soit le type de véhicule et de moteur. Ca facilite le traitement si on a une approche de type visiteur sur 5000 items: on itère sur les tous véhicules auto avec une seule instance de moteur auto.
Code:
1 2 3 4
| foreach (Vehicule vehiculeAuto in vehiculeAutoList)
{
vehicule.Roule(moteur);
} |
Mon problème est le suivant :
No overload for 'RouleAuto' matches delegate 'RouleHandler'
Je suis surpris de cette erreur de compilation car RouleAuto prend en paramètre un MoteurAuto qui est un Moteur.
1ere question pourquoi cette erreur ? On doit respecter strictement la signature d'un délégué pour qu'il soit valide ?
2e question : Quelle signature de méthode adopter pour que RouleHandler puisse s'exécuter sur type variés ? (approche du genre RouleX(MoteurX moteur)
ps :ca fait un bail que je suis pas passé dans le coin et ça fait toujours plaisir de poster en français.