class / struct

Références

L'actualité

Librairie

L'information

Héritage

L'héritage, avec l'encapsulation et le polymorphisme, est l'une des trois principales caractéristiques de la programmation orientée objet. Il permet de créer de nouvelles classes qui réutilisent, étendent et modifient le comportement défini dans les autres classes. La classe dont les membres sont hérités porte le nom de classe de base et la classe qui hérite de ces membres porte le nom de classe dérivée. Une classe dérivée ne peut avoir qu'une seule classe de base directe. Toutefois, l'héritage est transitif. Si la classe C est dérivée de la classe B et la classe B dérivée de la classe A, la classe C hérite des membres déclarés dans la classe B et la classe A.

Les structs ne prennent pas en charge l'héritage, mais ils peuvent implémenter les interfaces.

D'un point de vue conceptuel, une classe dérivée est une spécialisation de la classe de base. Par exemple, si vous avez une classe de base Animal, vous pouvez avoir une classe dérivée nommée Mammal et une autre classe dérivée nommée Reptile. Un Mammal est un Animal, et un Reptile est un Animal, mais chaque classe dérivée représente des spécialisations différentes de la classe de base.

Quand vous définissez une classe à dériver d'une autre classe, la classe dérivée obtient implicitement tous les membres de la classe de base, à l'exception de ses constructeurs et de ses finaliseurs. La classe dérivée peut ainsi réutiliser le code de la classe de base sans avoir à le réimplémenter. Vous pouvez ajouter d'autres membres à la classe dérivée. De cette manière, la classe dérivée étend les fonctionnalités de la classe de base.

L'illustration suivante montre une classe WorkItem qui représente un élément de travail dans un processus métier. Comme toutes les classes, elle dérive de System.Object et hérite de toutes ses méthodes. WorkItem ajoute cinq de ses propres membres. Cela inclut un constructeur, parce que les constructeurs ne sont pas hérités. La classe ChangeRequest hérite de WorkItem et représente un type particulier d'élément de travail. ChangeRequest ajoute deux membres supplémentaires aux membres qu'elle hérite de WorkItem et de Object. Elle doit ajouter son propre constructeur et ajoute également originalItemID. La propriété originalItemID permet à l'instance ChangeRequest d'être associée au WorkItem d'origine auquel s'applique la demande de modification.



Héritage de classe

L'exemple suivant montre comment les relations de classe de l'illustration précédente sont exprimées en langage C#. L'exemple montre également comment WorkItem substitue la méthode virtuelle Object.ToString, et comment la classe ChangeRequest hérite de l'implémentation WorkItem de la méthode.

Méthodes abstraites et virtuelles

Lorsqu'une classe de base déclare une méthode comme étant virtual, une classe dérivée peut substituer la méthode avec sa propre implémentation. Si une classe de base déclare un membre comme étant abstract, la méthode doit être substituée dans toutes les classes non abstraites qui héritent directement de cette classe. Si une classe dérivée est abstract, elle hérite des membres abstract sans les implémenter. Les membres virtual et abstract sont la base du polymorphisme, qui est la deuxième caractéristique principale de la programmation orientée objet.

Classes de base abstraites

Vous pouvez déclarer une classe comme étant abstract si vous voulez empêcher l'instanciation directe à l'aide du mot clé new. Si vous procédez ainsi, la classe ne peut être utilisée que si une nouvelle classe en est dérivée. Une classe abstract peut contenir une ou plusieurs signatures de méthode qui sont également déclarées comme abstract. Ces signatures spécifient les paramètres et la valeur de retour, mais n'ont aucune implémentation (corps de méthode). Une classe abstract ne doit pas nécessairement contenir des membres abstract. Toutefois, si une classe contient un membre abstract, elle doit être déclarée comme abstract. Les classes dérivées qui ne sont pas abstract doivent fournir une implémentation pour toutes les méthodes abstract d'une classe de base abstract.

Interfaces

Une interface est un type référence similaire à une classe de base abstract qui se compose uniquement de membres abstract. Quand une classe implémente une interface, elle doit fournir une implémentation pour tous les membres de l'interface. Une classe peut implémenter plusieurs interface, même si elle ne peut dériver que d'une seule classe de base directe.

Les interface sont utilisées pour définir des fonctions spécifiques pour les classes qui n'ont pas nécessairement de relation de type "est un". Par exemple, l'interface System.IEquatable‹T› peut être implémentée par toute class ou tout struct qui doit permettre au code client de déterminer si deux objets du type sont équivalents (toutefois, le type définit l'équivalence). IEquatable‹T› n'implique pas le même type de relation "est un" qui existe entre une class de base et une class dérivée (par exemple, un Mammal est un Animal).

Empêcher une dérivation supplémentaire

Une classe peut empêcher d'autres classes d'hériter d'elle, ou de l'un de ses membres, en se déclarant elle-même ou en déclarant un membre comme sealed.

Masquage des membres de la classe de base par une classe dérivée

Une classe dérivée peut masquer des membres de la classe de base en déclarant les membres à l'aide du même nom et de la même signature. Le modificateur new peut être utilisé pour indiquer explicitement que le membre n'est pas censé substituer le membre de base. L'utilisation du modificateur new n'est pas obligatoire. Toutefois, un avertissement du compilateur est généré si new n'est pas utilisé.