# Programmation C sharp/Héritage de classes

Une classe peut hériter d'une autre, c'est à dire posséder les mêmes méthodes et attributs que celle-ci et en avoir des supplémentaires. Cette nouvelle classe est appelée « classe fille » ou « sous-classe ». Elle hérite d'une « classe mère » ou « classe de base » ou « super-classe ».
L'héritage entre deux classes traduit la relation « est un type de ». Par exemple, une automobile est un type de véhicule. Elle possède la même fonctionnalité de transport que n'importe quel véhicule. En même temps, une automobile a des fonctionnalités plus précises qu'un véhicule : transport de personnes principalement, capacité de transport limitée, nombre de portes, puissance du moteur, ...
Ces spécificités de la sous-classe sont les seules qui ont besoin d'être définies dans celle-ci. Les autres fonctionnalités sont héritées de la super-classe.

## Classe de base et sous-classe

La classe de base (ou classe mère) est celle qui définit les membres qui seront hérités par les sous-classes. Une sous-classe (ou classe fille) hérite des membres de la classe mère, peut ajouter de nouveaux membres, implémenter de nouvelles interfaces et redéfinir le comportement des méthodes de la classe de base.
Lorsqu'une classe ne déclare aucune classe de base, par défaut elle hérite de la classe System.Object. La classe System.Object est la seule qui n'hérite d'aucune autre classe.

## Syntaxe

La relation d'héritage est définie à la déclaration de la classe par le symbole deux-points suivi du nom de la super-classe.
Exemple de super-classe :
Exemple de sous-classe :

## Constructeurs

Le constructeur de la sous-classe appelle toujours celui de la classe de base, implicitement ou explicitement. Si rien n'est spécifié, le compilateur génère un appel implicite au constructeur de la classe de base ne comportant aucun paramètre. C'est pourquoi ce constructeur est nommé « constructeur par défaut ».
Si la classe de base ne possède aucun constructeur par défaut, ou si un autre serait plus approprié, il est possible de spécifier explicitement le constructeur à appeler. Le mot-clé base désigne la classe de base.
Exemple :

## Référence d'instance

Une référence à une instance de la sous-classe peut être stockée par une référence du même type :
Il est également possible d'utiliser une référence du type de la classe de base :

## Redéfinition de méthodes et de propriétés

Dans cette section, la redéfinition de propriétés est similaire à la redéfinition de méthodes. Ce paragraphe discutera de la redéfinition de méthodes, mais tout ceci s'applique également aux propriétés.

### Redéfinition sans polymorphisme

La redéfinition d'une méthode consiste à créer une méthode dans une sous-classe ayant le même nom et les mêmes types d'arguments (la même signature) qu'une méthode de la classe de base, afin de modifier son comportement.
Exemple :
Cependant, le compilateur génère un avertissement (warning CS0108) dans la classe dérivée. Il faut spécifier que l'on redéfinit une méthode, en utilisant le mot clé new :
Utilisation :
Par contre, si on utilise une référence à la classe de base Vehicule, la méthode appelée sera celle de la classe de base :
Une conversion de la référence vers la classe réelle de l'objet permet d'appeler la méthode surchargée :
Cet exemple n'utilise donc pas le polymorphisme, c'est à dire que pour appeler la méthode Description, le compilateur se base sur le type de la référence plutôt que sur le type réel de l'objet référencé.

### Redéfinition avec polymorphisme

Le polymorphisme permet d'utiliser le type réel de l'objet référencé plutôt que le type de la référence pour déterminer la méthode, la propriété ou l'indexeur à utiliser. Pour cela, il faut utiliser le mot clé virtual dans la déclaration de la méthode de la classe de base.
Exemple :
Et il faut utiliser le mot clé override dans la classe dérivée :
Utilisation :
Si le mot clé new est utilisé à la place du mot clé override, le polymorphisme n'est pas effectif, comme dans le paragraphe précédent.

### Résumé

Pour résumer :
| | | Méthode de la classe de base | Méthode de la classe de base |
| | | normale | virtual |
| Méthode redéfinie dans la Classe dérivée | | Sans polymorphisme, avertissement CS0108 | Sans polymorphisme, avertissement CS0114 |
| Méthode redéfinie dans la Classe dérivée | new | Sans polymorphisme | Sans polymorphisme |
| Méthode redéfinie dans la Classe dérivée | override | erreur CS0506 | Avec polymorphisme |

## Classe sans héritière

Le mot-clé sealed empêche la création de classes dérivées. Cette fonctionnalité est également utile pour les classes ne déclarant que des membres statiques.
Syntaxe:
Exemple:
Ce type de classe ne peut avoir de méthodes abstraites (abstract) ou de membres protégés (protected) car aucune classe dérivée ne pourra être créée pour les implémenter / y accéder.