Aller au contenu

L'abstraction

Héritage d'une classe abstraite

Une classe abstraite est un type de classe possédant des méthodes définies mais qui ne sont pas implémentées. On peut dire que c'est un mixte entre une classe et une interface dans le même objet.

Par exemple, la classe Document permet d'avoir un fichier de configuration auquel on y attachera une propriété et une valeur. On sera assuré de pouvoir avoir le fichier en texte, mais on ne dit pas comment. Ce sera aux classes héritées à le définir.

classDiagram
    Document <|-- Json
    Document <|-- Yaml

    class Document {
        String extension
        String nom
        String propriete
        String valeur

        Document(nom, extension, propriete, valeur)

        getPropriete() String
        getValeur() String

        *getTexte() String  // méthode abstraite
    }

    class Json {
        Json(nom, propriete, valeur)
    }

    class Yaml {
        Yaml(nom, propriete, valeur)
    }

Par la suite, les classes Json et Yaml devront hériter de la classe Document ainsi que d'implanter correctement la méthode getTexte() selon leur format respectif :

Document.java
public abstract class Document {

    // [...]

    protected Document(String nom, String extension, String propriete, String valeur) {
        // [...]
    }

    public abstract String getTexte();

    // [...]
}
Json.java
public class Json extends Document {

    public Json(String nom, String propriete, String valeur) {
        super(nom, "json", propriete, valeur);
    }

    @Override
    public String getTexte() {
        return String.format("""
                {
                    "format": "json",
                    "%s": "%s"
                }
                """, this.getPropriete(), this.getValeur());
    }
}
Yaml.java
public class Yaml extends Document {

    public Yaml(String nom, String propriete, String valeur) {
        super(nom, "yaml", propriete, valeur);
    }

    @Override
    public String getTexte() {
        return String.format("""
                ---
                format: yaml
                %s: %s
                """, this.getPropriete(), this.getValeur());
    }

}

Instancier une classe abstraite

Une classe abstraite peut également être instanciée. Cependant, comme elle possède des méthodes à implanter, celles-ci devront être définie lors de la création de la nouvelle instance :

public static void main(String[] args) {
    Document ini = new Document("config", "ini", "adresse", "192.168.2.56") {
        @Override
        public String getTexte() {
            return String.format("""
                    [config]
                    format=ini
                    %s=%s
                    """, this.getPropriete(), this.getValeur());
        }
    };
    System.out.println(ini.getTexte());
}