Salut,

Soit les classes de base Véhicule() et Moteur().
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);
            }
        }
    }
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 : 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);
 
        }
    }
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 : 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.