Aller au contenu

Programmation C sharp/Classe abstraite

Un livre de Wikilivres.
Programmation C#
Programmation C#
Modifier ce modèle

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.

Le 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

[modifier | modifier le wikicode]

La 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

[modifier | modifier le wikicode]

Il 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 ; }
    }
}

Les 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.