héritage et polymorphisme
L’héritage c’est le fait qu’une classe hérite des
membres protégés ou publics d’une autre classe.
Pour une classe B héritant d'une classe A, la syntaxe est
class A
{
}
class B :
A
{
}
Soit le programme ci-dessous :
|
using System;
namespaceheritage
{
class
Class1
{
class
Maclasse
{
protected string
_pays;
protected string
Ville;
public Maclasse(string
champ1, string champ2)
{
this._pays = champ1;
this.Ville = champ2;
}
public void
affiche()
{
Console.WriteLine("pays: {0} , Ville: {1}",_pays,Ville);
}
}
class
Taclasse:Maclasse
{
private int
_bp;
public Taclasse(string
champ1, string champ2, int
champ3):base(champ1,champ2)
{
this._bp = champ3;
}
public void
affiche2()
{
affiche();
Console.WriteLine("B.P: {0}",_bp);
}
[STAThread]
static void Main(string[]
args)
{
Maclasse obj1 = new Maclasse("bresil","brasilia");
Taclasse obj2 = new Taclasse("france","paris",75);
obj1.affiche();
obj2.affiche2();
Console.ReadLine();
}
}
}
|

On constate bel et bien que la classe Taclasse a bien hérité
des membres et des méthodes de la classe Maclasse. Puisque Taclasse accède aux
champs _pays, Ville et aux méthodes Taclasse() et affiche() de la classe
Maclasse.
Les membres déclarés protected
sont accessibles que dans la classe elle-même et ses classes dérivées. Si les
variables _pays et Ville étaient déclarées private,
les instances de Taclasse n’auraient jamais eu accès à ces variables. Il en
est de même pour les méthodes.
Polymorphisme
C’est le fait qu’une fonction puisse avoir plusieurs définitions.
Reprenons le programme précédent et ajoutons y la méthode
ClasseMethode() :
|
using System;
namespace heritage
{
class
Class1
{
class
Maclasse
{
protected string
_pays;
protected string
Ville;
public Maclasse(string
champ1, string champ2)
{
this._pays = champ1;
this.Ville = champ2;
}
public void
affiche()
{
Console.WriteLine("pays: {0} , Ville: {1}",_pays,Ville);
}
public
virtual void
ClasseMethode()
{
Console.WriteLine("je suis bien en {0}",_pays);
}
}
class
Taclasse:Maclasse
{
private int
_bp;
public Taclasse(string
champ1, string champ2, int
champ3):base(champ1,champ2)
{
this._bp = champ3;
}
public void
affiche2()
{
affiche();
Console.WriteLine("B.P: {0}",_bp);
}
public
override void
ClasseMethode()
{
Console.WriteLine("je suis bien en {0} et ma boîte
postale est bien {1} .",_pays,_bp);
}
}
[STAThread]
static void Main(string[]
args)
{
Maclasse obj1 = new Maclasse("italie","rome");
Taclasse obj2 = new Taclasse("france","paris",75019);
Maclasse obj3 = new Taclasse("allemagne","berlin",45010);
obj1.affiche();
obj1.ClasseMethode();
obj2.affiche2();
obj2.ClasseMethode();
obj3.affiche();
obj3.ClasseMethode();
Console.ReadLine();
}
}
}
|
Le programme exécuté affiche :

Le mot clef virtual affecté
à la méthode ClasseMethode() dans la
classe Maclasse ne change rien pour le déroulement de la méthode dans cette
classe. Mais par contre indique plutôt que la méthode sera redéfinie dans une
classe dérivée. Dans la classe fille Taclasse, la méthode ClasseMethode() est
précédée du mot clef override. Ce dernier précise
que c’est une redéfinition de la méthode virtuelle de la classe de base. Le
mot clef virtual permet d’appeler la méthode de la classe instanciée.
C’est pourquoi lorsque obj1 et
obj2 font appel à ClasseMethode(), on n’a pas les mêmes résultats.
Bien que
l’instance obj3 soit de type Maclasse, c’est la méthode ClasseMethode() de
la classe Taclasse qui est appelée parce que obj3 est instancié par Taclasse.
Sommaire
1. Les collections
2. les structures
3. les classes
4. Les propriétés
5. Les exceptions
6. Héritage et polymorphisme
7. Les interfaces
8. Surcharge d’opérateurs
9. La délégation
10. Les évènements
|
|
 |
Pour afficher ou poster un commentaire, cliquez sur ce lien : Forum-Microsoft
|
|