La surcharge
Définition
Ce concept objet s’applique aux constructeurs et aux méthodes des classes (que les méthodes soient statiques ou non). Il s'applique aussi aux indexeurs et aux opérateurs, mais ces applications sortent du cadre de cet article. Il permet de décliner un service de création d’objet, ou un service d’instance ou statique, pour proposer un même traitement ou un traitement différent mais avec des paramètres d’entrée différents. De plus, il peut être utilisé au sein d’une même classe (constructeurs et méthodes) ou au sein d’un arbre d’héritage (méthodes seulement). Nous avons déjà vu ce concept dans le chapitre sur les classes.
Une méthode surcharge une autre méthode lorsqu’elles portent le même nom, mais qu’elles ne possèdent pas la même liste de types de paramètres dans le même ordre. Le même principe s’applique aux constructeurs.
Surcharge de constructeurs
Voici un exemple de surcharge de constructeurs :
public class Donut : Gateau
{
public double DiametreInterne { get; }
public Donut(double diametreExterne)
: this(diametreExterne, 1.2)
{
}
public Donut(double diametreExterne, double diametreInterne)
: base(diametreExterne)
{
DiametreInterne = diametreInterne;
}
public void Frire()
{
// Cuisson spécifique du donut
}
public void Napper()
{
// Nappage du donut
}
}
Dans cet exemple, la classe Donut propose deux constructeurs surchargés, permettant de créer un donut en précisant uniquement son diamètre externe ou ses deux diamètres.
La bonne pratique est d'implémenter le chaînage des constructeurs, afin non seulement de factoriser l’initialisation de l’objet, mais aussi de faciliter son évolution lors de l’ajout de nouveaux attributs. Le premier constructeur appelle le second en précisant une valeur par défaut pour le diamètre interne. Le second constructeur fournit le diamètre externe au constructeur de la classe de base Gateau, puis initialise le diamètre interne propre au donut.
Surcharge de méthodes
Dans la classe Donut, nous pouvons surcharger la méthode Napper existante, en ajoutant une méthode de même nom possédant une liste de paramètres différente :
Ainsi, il est possible de napper une instance de la classe Donut sans fournir de paramètre, ou en fournissant le parfum et le nombre de couches.