Вы находитесь на странице: 1из 5

Mthodes et classes abstraites

1.7 Mthodes abstraites

Le mot clef abstract est utilis pour reprsenter une classe ou une mthode abstraite. Quel
est l'intrt de cette notion ? Avoir des modles gnriques permettant de dfinir
ultrieurement des actions spcifiques.

Une mthode dclare en abstract dans une classe mre :

o N'a pas de corps de mthode.


o N'est pas excutable.
o Doit obligatoirement tre redfinie dans une classe fille.

Une mthode abstraite n'est qu'une signature de mthode sans implmentation dans
la classe.

Exemple de mthode abstraite :

class Etre_Vivant {
}

La classe Etre_Vivant est une classe mre gnrale pour les tres vivants sur la plante,
chaque catgorie d'tre vivant peut tre reprsente par une classe drive (classe fille de cette
classe) :

class Serpent : Etre_Vivant {


}

class Oiseau : Etre_Vivant {


}

class Homme : Etre_Vivant {


}

Tous ces tres se dplacent d'une manire gnrale, donc une mthode SeDeplacer est
commune toutes les classes drives, toutefois chaque espce excute cette action d'une
manire diffrente et donc on ne peut pas dire que se dplacer est une notion concrte mais
une notion abstraite que chaque sous-classe prcisera concrtement.

En C#, les mthodes abstraites sont automatiquement virtuelles, elles ne peuvent tre
dclares que public ou protected, enfin elles doivent tre redfinies avec le qualificateur
override. Ci-dessous deux dclarations possibles pour le dplacement des tres vivants :

abstract class Etre_Vivant {


public abstract void SeDeplacer( ); abstract class Etre_Vivant {
} protected abstract void SeDeplacer( );
}
class Serpent : Etre_Vivant {
public override void SeDeplacer( ) { class Serpent : Etre_Vivant {
//.....en rampant protected override void SeDeplacer( ) {

Document1 1/5
} //.....en rampant
} }
}
class Oiseau : Etre_Vivant {
public override void SeDeplacer( ) { class Oiseau : Etre_Vivant {
//.....en volant protected override void SeDeplacer( ) {
} //.....en volant
} }
}
class Homme : Etre_Vivant {
public override void SeDeplacer( ) { class Homme : Etre_Vivant {
//.....en marchant protected override void SeDeplacer( ) {
} //.....en marchant
} }
}

Comparaison de dclaration d'abstraction de mthode en Delphi et C# :

C#
abstract class Etre_Vivant {
public abstract void SeDeplacer( );
}

class Serpent : Etre_Vivant {


public override void SeDeplacer( )
{ //.....en rampant }
}

class Oiseau : Etre_Vivant {


public override void SeDeplacer( )
{ //.....en volant }
}

class Homme : Etre_Vivant {


public override void SeDeplacer( )
{ //.....en marchant }
}

En C# une mthode abstraite est une mthode virtuelle nayant pas dimplmentation dans la
classe o elle est dclare. Son implmentation est dlgue une classe drive. Les
mthodes abstraites doivent tre dclares en spcifiant la directive abstract .

1.8 Classe abstraite, Interface

Classe abstraite
Comme nous venons de le voir dans l'exemple prcdent, une classe C# peut tre prcde du
mot clef abstract, ce qui signifie alors que cette classe est abstraite, nous avons les contraintes
de dfinition suivantes pour une classe abstraite en C# :

Si une classe contient au moins une mthode abstract, elle doit imprativement tre dclare
en classe abstract elle-mme. C'est ce que nous avons crit au paragraphe prcdent pour la

Document1 2/5
classe Etre_Vivant que nous avons dclare abstract parce qu'elle contenait la mthode
abstraite SeDeplacer.

Une classe abstract ne peut pas tre instancie directement, seule une classe drive (sous-
classe) qui redfinit obligatoirement toutes les mthodes abstract de la classe mre peut tre
instancie.

Consquence du paragraphe prcdent, une classe drive qui redfinit toutes les mthodes
abstract de la classe mre sauf une (ou plus d'une) ne peut pas tre instancie et subit la mme
rgle que la classe mre : elle contient au moins une mthode abstraite donc elle est aussi une
classe abstraite et doit donc tre dclare en abstract.

Une classe abstract peut contenir des mthodes non abstraites et donc implantes dans la
classe. Une classe abstract peut mme ne pas contenir du tout de mthodes abstraites, dans
ce cas une classe fille n'a pas la ncessit de redfinir les mthodes de la classe mre pour tre
instancie.

Interface
Lorsqu'une classe est dclare en abstract et que toutes ses mthodes sont dclares en
abstract, on appelle en C# une telle classe une Interface.
Rappel classes abstraites-interfaces

Les interfaces ressemblent aux classes abstraites sur un seul point : elles contiennent des
membres expliquant certains comportements sans les implmenter.
o Les classes abstraites et les interfaces se diffrencient principalement par le fait
qu'une classe peut implmenter un nombre quelconque d'interfaces, alors qu'une
classe abstraite ne peut hriter que d'une seule classe abstraite ou non.

Vocabulaire et concepts :
Une interface est un contrat, elle peut contenir des proprits, des mthodes et des
vnements mais ne doit contenir aucun champ ou attribut.
Une interface ne peut pas contenir des mthodes dj implmentes.
Une interface doit contenir des mthodes non implmentes.
Une interface est hritable.
On peut contsruire une hirarchie d'interfaces.
Pour pouvoir construire un objet partir d'une interface, il faut dfinir une classe non abstraite
implmentant toutes les mthodes de l'interface.

Une classe peut implmenter plusieurs interfaces. Dans ce cas nous avons une excellente alternative
l'hritage multiple.

Lorsque l'on cre une interface, on fournit un ensemble de dfinitions et de comportements qui ne
devraient plus tre modifis. Cette attitude de constance dans les dfinitions, protge les applications
crites pour utiliser cette interface.

Les variables de types interface respectent les mmes rgles de transtypage que les variables de types

Document1 3/5
classe.

Les objets de type classe clA peuvent tre transtyps et refrencs par des variables d'interface IntfA
dans la mesure o la classe clA implmente linterface IntfA. (cf. polymorphisme d'objet)

Si vous voulez utiliser la notion d'interface pour fournir un polymorphisme une famille de classes,
elles doivent toutes implmenter cette interface, comme dans l'exemple ci-dessous.

Exemple :

l'interface Vhicule dfinissant 3 mthodes (abstraites) Dmarrer, RpartirPassagers de rpartition


des passagers bord du vhicule (fonction de la forme, du nombre de places, du personnel charg de
s'occuper de faire fonctionner le vhicule...), et PriodicitMaintenance renvoyant la priodicit de la
maintenance obligatoire du vhicule (fonction du nombre de km ou miles parcourus, du nombre
d'heures d'activits,...)

Soit l'interface Vhicule dfinissant ces 3 mthodes :

interface IVehicule{
void Demarrer( );
void RpartirPassager( );
void PriodicitMaintenance( );
}

Soient les deux classes Vhicule terrestre et Vhicule marin, qui implmentent partiellemnt chacune
l'interface Vhicule , ainsi que trois classes voiture, voilier et croiseur hritant de ces deux classes :

Les trois mthodes de l'interface Vhicule sont abstraites et publiques par dfinition.
Les classes Vhicule terrestre et Vhicule marin sont abstraites, car la mthode
abstraite Dmarrer de l'interface Vhicule n'est pas implmente elles reste comme
"modle" aux futurs classes. C'est dans les classes voiture, voilier et croiseur que l'on
implmente le comportement prcis du genre de dmarrage.

Document1 4/5
Dans cette vision de la hirarchie on a suppos que les classes abstraites Vhicule terrestre et
Vhicule marin savent comment rpartir leur ventuels passagers et quand effectuer une maintenance
du vhicule.

Les classes voiture, voilier et croiseur , n'ont plus qu' implmenter chacune son propre
comportement de dmarrage.

Une interface C# peut tre qualifie par un des 4 modificateur public, protected, internal, private.

Contrairement Java, une classe abstraite C# qui implmente une interface doit obligatoirement
dclarer toutes les mthodes de l'interface, celles qui ne sont pas implmentes dans la classe abstraite
doivent tre dclares abstract. C'est le cas dans l'exemple ci-dessous pour la mthode abstraite
Dmarrer , nous proposons deux critures possibles pour cette hirarchie de classe :

C# C#
mthode abstraite sans corps mthode virtuelle corps vide
interface IVehicule{ interface IVehicule{
void Demarrer( ); void Demarrer( );
void RpartirPassager( ); void RpartirPassager( );
void PriodicitMaintenance( ); void PriodicitMaintenance( );
} }

abstract class Terrestre : IVehicule { abstract class Terrestre : IVehicule {


public abstract void Demarrer( ); public virtual void Demarrer( ){}
public void virtual RpartirPassager( ){...} public void virtual RpartirPassager( ){...}
public void virtual PriodicitMaintenance( public void virtual PriodicitMaintenance(
){...} ){...}
} }

class Voiture : Terrestre { class Voiture : Terrestre {


override public void Demarrer( ){...} override public void Demarrer( ){...}
} }

abstract class Marin : IVehicule { abstract class Marin : IVehicule {


public abstract void Demarrer( ); public virtual void Demarrer( ) {}
public void virtual RpartirPassager( ){...} public void virtual RpartirPassager( ){...}
public void virtual PriodicitMaintenance( public void virtual PriodicitMaintenance(
){...} ){...}
} }

class Voilier : Marin { class Voilier : Marin {


override public void Demarrer( ){...} override public void Demarrer( ){...}
} }
class Croiseur : Marin { class Croiseur : Marin {
override public void Demarrer( ){...} override public void Demarrer( ){...}
} }

Les mthodes RpartirPassagers, PriodicitMaintenance et Demarrer sont implantes virtual , soit


comme des mthodes liaison dynamique, afin de laisser la possibilit pour des classes enfants de
redfinir ces mthodes.

Document1 5/5