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 ?

*

*

Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil Doctrine

Comment exécuter une requête LIKE ?

Pour créer une requête LIKE avec Doctrin2, on peut utiliser les expressions. Par exemple, on veut récupérer toutes les actualités dont le titre commence par "Comment faire". Le champ correspondant dans le fichier d'entité sera représenté par la variable $newsTitle. On veut également que l'auteur s'appelle "Nick". Voici comment on peut écrire une requête LIKE sous Doctrin2 :

    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->add('select', 'n.idNews')
    ->add('from', 'PagesNewsBundle:News n')
    ->add('where', $qb->expr()->andx(
      $qb->expr()->eq('n.newsAuthor', '?1'),
      $qb->expr()->like('n.newsTitle', '?2')
    ))
    ->setParameter(1, 'Nick') 
    ->setParameter(2, 'Comment faire%');
    $query = $qb->getQuery();
    $rows = $query->getResult();