L'héritage
L’héritage de classe
Comme vu précédemment, toutes les classes du Framework .NET dérivent de la classe System.Object. L’héritage peut être mis en œuvre de deux manières ; l’héritage de classe et l’héritage d’interface.
L’héritage implique qu’un type dérive d’un type de base en prenant tous ses membres accessibles. L’héritage est utile lorsque vous devez ajouter des fonctionnalités à un type existant ou quand plusieurs types partagent les mêmes fonctionnalités.
1. Implémenter l’héritage
La déclaration de l’héritage utilise une syntaxe simple, il suffit de rajouter le nom du type de base après le nom de la classe dérivée et le caractère :. Une classe ne peut dériver que d’un seul et unique type de base.
Le meilleur exemple est le formulaire Form1.cs.
Ouvrez le fichier dans l’éditeur de texte et observez la déclaration de la classe :
public partial class Form1 : Form
La classe Form1 dérive de la classe de base Form. Form1 contient donc tous les membres accessibles de sa classe de base. L’IntelliSense permet de les retrouver facilement :
Si aucune classe de base n’est spécifiée, le compilateur considère que System.Object est la classe de base. Ainsi, les deux exemples ci-dessous sont identiques :
public class Project : System.Object // Héritage explicite
{
}
public class Project // Héritage implicite
{
}
Pour la simplicité, l’héritage de la classe Object n’est jamais explicitement marqué dans la définition d’une classe.
Les membres qui sont accessibles depuis la classe dérivée sont ceux qui ont un niveau d’accès public, protected ou internal. Les membres privés (private) ne seront pas visibles par la classe héritée.
2. Les membres virtuels
En déclarant un membre de la classe de base avec le mot-clé virtual, vous autorisez le membre à être surchargé par les classes dérivées. Cela...
Les interfaces
Les interfaces vont permettre de définir des comportements pour les classes qui les implémentent. Les classes qui vont implémenter la même interface seront capables d’interagir de façon polymorphe. Il en résulte que tout type implémentant une interface fournit obligatoirement une implémentation des membres définis dans cette interface.
L’interface ne fait que définir les membres qu’un type devra implémenter de la même manière qu’une classe abstraite (à la différence que les types ne dériveront pas de cette classe abstraite et pourront donc être totalement indépendants les uns des autres). Par contre, comme pour les classes abstraites, une interface ne peut pas être instanciée.
1. L’implémentation d’interfaces
La syntaxe de déclaration d’une interface est proche de celle de la déclaration d’une classe en utilisant le mot-clé interface.
Dans le projet SelfMailer, créez un nouvel élément dans le dossier Library ([Ctrl][Shift] A lorsque le dossier est sélectionné). Dans la fenêtre Ajouter un nouvel élément, sélectionnez Interface et nommez le fichier IReportChange.cs. Par convention les noms des interfaces commencent traditionnellement par la lettre i majuscule de manière à pouvoir les repérer plus facilement dans le code. Mais rien n’empêche de définir un nom qui ne commence pas par ce caractère.
Cette interface sera implémentée sur les classes du projet afin que les classes implémentent un système de rapport de leurs changements. L’interface se présente de la manière suivante :
interface IReportChange
{
}
Définissez les membres de l’interface :
interface IReportChange
{
bool HasChanged
{ ...