Salut,
Soit les classes de base Véhicule() et 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 )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } } }
ainsi que les classe héritière de Moteur : MoteurAuto et MoteurManuel
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager