Abstraction des données

Données abstraites en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Les choses abstraites peuvent être également concerner la programmation orientée objet (OOP), aussi bien en PHP qu'en Java.

L'abstraction est un des fondaments de l'OOP. Il s'agit d'un processus qui permet de déterminer les données importantes. Elle joue un rôle instructif (facilité de compréhension dans une équipe de développement). Elle permet également de s'assurer que certaine logique de l'application sera gardée dans les sous-classes. Dans l'abstraction il s'agit donc de ne pas spécifier obligatoirement le comportement spécial d'une méthode. A la place de cela, il suffit de donner un trait de la classe, en précisant uniquement ses méthodes et attributs. Regardons cela sur cet exemple :

public class Abstraction {
    public static void main(String[] args) {
        Dog dogInst = new Dog("D#1", "Europe");
        dogInst.printInfo();
        System.out.println("Dog's area is " + dogInst.getArea());
        Cat catInst = new Cat("C#1", "Europe");
        catInst.printInfo();
        System.out.println("Cat's area is " + catInst.getArea());
    }
}

abstract class Animal {
    protected String name;
    protected String area;
  
    public abstract void printInfo();

    public String getName() {
        return name;
    } 
  
    public String getArea() {
        return area;
    } 
}

class Dog extends Animal {
    public Dog(String n, String a) {
        name = n;
        area = a;
    }
 
    public void printInfo() {
        System.out.println("A dog's name is " + name + ". He lives in " + area);
    }
}

class Cat extends Animal {
    public Cat(String n, String a) {
        name = n;
        area = a;
    }
  
    public void printInfo() {
        System.out.println("A cat's name is " + name + ". He lives in " + area);
    }
}

Voici le résultat :

A dog's name is D#1. He lives in Europe
Dog's area is Europe
A cat's name is C#1. He lives in Europe
Cat's area is Europe

On remarque que la classe Animal est précédée par le mot-clé abstract. Cela veut dire qu'elle ne peut pas être initialisée. La méthode printInfo() contient le même mot-clé. Cela veut dire que sa présence dans la classe Animal est juste significative (= elle ne contient rien dans son contenu). Par contre sa présence force toutes les classes héritantes de surcharger cette fonction. Si elle était absente, on aurait au moment de compilation un message d'erreur "Abstraction.java:44: Cat is not abstract and does not override abstract method printInfo() in Animal".

Voici les points pouvant résumer l'abstraction :
- elle permet de séparer les données (attributs et méthodes) importantes de leurs implémentation
- elle facilite une meilleure contrôle sur le comportement des sous-classes
- si une méthode est déclarée abstraite, la classe doit l'être également
- si une méthode est déclarée abstraite, elle ne peut pas contenir le contenu et doit être surchargée dans les classes héritantes
- la classe abstraite ne peut pas être initialisée

Quelle est la différence entre une interface et une classe abstraite ?

Une question ? Une remarque ?

*

*

Un conseil Android

Comment accéder au localhost ?

A la place de 127.0.0.1 il faut utiliser 10.0.2.2.