Programmation C sharp/Classe abstraite
Une classe abstraite possède au moins une méthode abstraite ou une propriété abstraite, c'est à dire ne comportant aucune implémentation (pas de code). Une telle classe ne peut être instanciée avec l'opérateur new
. Il faut utiliser une sous-classe implémentant les méthodes abstraites de la classe de base.
Syntaxe
modifierLe mot clé abstract
doit précéder la classe abstraite et toutes les méthodes abstraites.
Exemple :
// Classe abstraite gérant un ensemble d'objets
public abstract class Ensemble
{
public bool AjouterSiNeContientPas(object o)
{
if ( ! Contient(o) )
Ajouter(o);
}
public bool RetirerSiContient(object o)
{
if ( Contient(o) )
Retirer(o);
}
// méthodes abstraites (sans implémentation) :
public abstract bool Contient(object o);
protected abstract void Ajouter(object o);
protected abstract void Retirer(object o);
}
Implémenter les méthodes abstraites
modifierLa classe implémentant les méthodes abstraites de la classe de base doit utiliser le mot clé override
, car les méthodes abstraites sont implicitement virtuelles également :
public class EnsembleTableau : Ensemble
{
private object[] elements = new object[0];
public override bool Contient(object o)
{
// recherche de l'objet
for(int i = 0 ; i < elements.Length ; i++)
if (elements[i] == o) return true; // objet trouvé
// fin de la boucle sans avoir trouvé l'objet
return false;
}
protected override void Ajouter(object o)
{
// ...
}
protected override void Retirer(object o)
{
// ...
}
}
La classe peut ne pas implémenter toutes les méthodes abstraites de la classe de base. Dans ce cas elle est également abstraite, et laisse le soin à ses sous-classes d'implémenter les méthodes abstraites restantes.
Propriétés abstraites
modifierIl est également possible de déclarer des propriétés abstraites.
Exemple :
public abstract class Ensemble
{
public abstract int nombre { get; }
public abstract string nom { get; set; }
}
public class EnsembleTableau : Ensemble
{
private string nom_ensemble = null;
private object[] elements = new object[0];
public override int nombre
{
get { return elements.Count; }
}
public override string nom
{
get { return nom_ensemble ; }
set { nom_ensemble = value ; }
}
}
Mode d'accès
modifierLes méthodes et propriétés abstraites peuvent être publiques ou protégées.
Puisque les méthodes et propriétés abstraites doivent être implémentées par les sous-classes, il n'est pas possible de les déclarer avec le mot clé private
, ou d'utiliser le mot clé sealed
avec la classe.
De plus les méthodes et propriétés abstraites ne peuvent être statiques.