Le concept d’abstraction en POO

Le concept d’abstraction en POO

 

Je vais vous présenter ici un concept fondamental de la programmation orientée objet,

En programmation structurée, les données qui ont un lien logique sont regroupées en structures, les enregistrements. De la même manière, les instructions qui ont un lien logique sont rassemblées dans des sous-programmes. Ainsi, les données et le code sont structurés, et on atteint un certain niveau d'abstraction puisqu'un seul identificateur regroupe les champs d'un enregistrement ou l'ensemble des instructions d'un sous-programme.

 

Quand on parles d’abstraction, on parles également d’encapsulation :

Pour permettre l'abstraction des données, les LOO (langage orienté objets) fournissent une structure qui regroupe (ou encapsule) les données et les sous-programmes qui les utilisent. Une telle structure est appelée classe, et l'instance d'une classe (la déclaration d'une variable de type classe) est appelée objet. Les classes sont composées de données membres (que l'on peut comparer aux champs des enregistrements de la programmation structurée) et de fonctions membres, qui définissent les opérations à réaliser sur les données membres.

 

Les programmes qui manipulent des objets ne connaissent pas les identificateurs des données membres de ces objets. Les échanges de données entre le programme et les objets se font au moyen d'une interface clairement définie (les fonctions membres) et donc indépendante des données membres. Aussi longtemps que cette interface ne change pas, les données-membres et le code des fonctions membres de l'objet peuvent changer sans nécessiter la modification du programme qui utilise l'objet. Cela permet une modularité plus grande et une indépendance vis-à-vis du choix de la représentation interne des données.

 

Définition et exemple :

 

Dans le contexte orienté objet, l'abstraction est un mécanisme, ou une pratique, servant à réduire le code d'un niveau de détail. Autrement dit, l'abstraction permet de regrouper un certain nombre de classes selon des caractéristiques communes.

 

Supposons que l’on veuille créer un programme qui gère les élèves d’un lycée. Tous les élèves ont forcément certaines caractéristiques: un âge, une moyenne générale. Cependant, les élèves de première auront des attributs qui les différencie des autres: ils ont philo au lieu de français par exemple. C’est un attribut essentiel pour notre futur objet “élève de première”, cela le différencie de la classe de base élève et de la classe “élève de seconde”. Et il est important de noter qu’il n’y a aucun sens à créer un objet de la classe élève directement, un tel objet manquerait d’attributs essentiels. On ne peut avoir un élève sans qu’il soit de seconde, première ou terminale.

 

La classe élève est une classe abstraite.

 

En bref, on utilise une classe abstraite pour que d’autres classes héritent d’elle grâce à extends. Une classe abstraite n’existe pas pour qu’un objet soit créé directement à partir d’elle, on crée les objets à partir de classes qui ont hérité de la classe abstraite(la classe de base).

 

On ne peut pas instancier une classe abstract: Les classes définies comme abstract ne peuvent pas être instanciées, et toute classe contenant une méthode abstract doit être définie comme abstract

 

Les exemples présenté ci-dessous sont fait en PHP, mais cela vaut pour tout type de langage orientée objet.

 

Exemple:

 

abstract class AbstractClass
{
   abstract protected function getValue();
   abstract protected function prefixValue($prefix);
   public function printOut() {
       echo "Hello how are you?";
   }
}
$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

 

Abstract Class

 

  1. Classe ayant une méthode abstract doit être abstract
  2. Une classe abstract ne peut pas être directement instanciée
  3. On ne peut donc pas créer d’objet avec une classe abstract
  4. Elle est seulement utilisée pour l’héritage. Elle existe pour qu’on utilise extends dessus.

 

Abstract Method

 

  1. Ne peut pas contenir de corps (pas de crochets ex: abstract public function myFunc();)
  2. Ne peut pas être private
  3. child class must declare defined method in abstract class

 

La notion d’abstraction en POO va nous permettre de créer les fondations de nos classe et pour les utilisées nous devons utilisé le systéme d’héritage. Un exemple concret :

Un être humain a toujours deux bras , deux jambes , une tête et un corps (du moins sur le papier), ensuite ce qui va définir que vous êtes un homme ou une femme c’est quoi ?

 

Imaginons que nous créons une classe abstraite qu’ont vas appeler “Humain” , cette classe va contenir tout ce qui défini un être humain. Nous déclarons donc notre classe avec le mot clé “abstract”

 

abstract class Humain

  {

   

  }

 

Pour continuer dans l’abstrait nous allons définir des fonctions abstraite qui vont définir notre humain :

abstract class Humain

  {

 abstract function Tete();

 abstract function Corps();

             abstract function Jambes();

 abstract function Bras();

 abstract function Sexe();

  }

 

Comme pour les class abstraite , les fonctions abstraite s’appel par le mot clé “abstract”

 

içi nous avons donc défini a notre humain : Une tête , un corps , des jambes , des bras et un Sexe.

 

Félicitation vous venez de créer votre première classe Abstraite ! Enjoy …

Essayer donc de récuprer une fonction , comme nous le ferions d’habitude.

 

$Humain = new Humain();

  echo $Humain->Corps();

 

Içi nous essayons donc de récupérer le corps de l’humain , A votre avis quelle en sera le résultat ?

 

(Une erreur Fatal nous disant que nous ne pouvons pas utiliser une classe abstraite , Une notion qui aura été vue dans notre intro à l’abstraction)

 

Donc c’est bien cool d’avoir une class abstraite , mais ça sert a quoi dans notre cas ?

 

Notre classe abstraite va nous servir de base pour pouvoir crée des hommes et des femmes car la nous avons défini un humain universelle.

 

Nous allons définir la class Homme , c’est class descend directement de notre class Humain

 

class Homme extends Humain

  {

}

 

Et nous allons donc personnalisé notre classe homme en reprenant les fonctions de son parent

 

 class Homme extends Humain

  {

public function Tete(){

  return 'La tete <br/>';

}

 

public function Corps(){

  return 'Le corps <br/>';

}

 

public function Jambes(){

  return 'Les jambes <br/>';

}

 

public function Bras(){

  return 'Les bras <br/>';

}

 

public function Sexe(){

  return 'Masculin';

}

}

 

Cette classe ressemble beaucoup à ce que nous avons fait dans la class abstraite Humain , a la seul différent c’est nos fonction vont maintenant renvoyer une valeure

 

Et maintenant nous allons crée notre object Homme pour utilisé notre class Homme  et voir ce qui caractérise un homme.

 

$Homme = new Homme();

 

  echo $Homme->Tete();

echo $Homme->Corps();

echo $Homme->Jambes();

echo $Homme->Bras();

echo $Homme->Sexe();

 

Voici notre premier homme !

 

“La tete

Le corps

Les jambes

Les bras

Masculin”

 

Et voici ce que nous pouvons par exemple faire pour définir notre class Femme et descend de la class Humain

 

class Femme extends Humain

 {

public function Tete(){

  return 'La tete <br/>';

}

 

public function Corps(){

  return 'Le corps <br/>';

}

 

public function Jambes(){

  return 'Les jambes <br/>';

}

 

public function Bras(){

  return 'Les bras <br/>';

}

 

public function Sexe(){

  return 'Feminin';

}

 }

 

$Femme = new Femme();

 

 echo $Femme->Tete();

 echo $Femme->Corps();

 echo $Femme->Jambes();

 echo $Femme->Bras();

 echo $Femme->Sexe();

 

Et voici notre premiere femme !  

 

“La tete

Le corps

Les jambes

Les bras

Feminin”

Classe abstraite ou interface ?

 

Oui car la question peut se poser, étant donnée que les deux on l’air d’avoir une utilisation plutôt similaire sur le papier apparues avec PHP 5, les classes abstraites et autres interfaces mettent du temps à s’imposer au sein de la communauté des développeurs PHP.

 

Largement répandues dans les mondes Java et .NET, ces deux notions constituent l’un des fondements de la programmation orientée objet.

 

Si leur utilisation n’est pas particulièrement souhaitable pour générer de simples pages web dynamiques, en revanche, lorsqu’il s’agit de construire de véritables applications métier, aucune hésitation n’est permise mais encore faut-il avoir compris leur utilité !

 

La différence entres les deux classes se caractérise en jetant encore un coup d’oeil à ce qui les définis :

 

Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées.

 

Elle n’est donc pas instanciable, mais sert avant tout à factoriser du code. Une classe qui hérite d’une classe abstraite doit obligatoirement implémenter les méthodes manquantes (qui ont été elles-mêmes déclarées «abstraites» dans la classe parente).

 

En revanche, elle n’est pas obligée de réimplémenter les méthodes déjà implémentées dans la classe parente (d’où une maintenance du code plus facile).

 

Alors qu’une interface est un peu comme une classe abstraite dans laquelle aucune méthode ne serait implémentée : les méthodes y sont seulement déclarées.

 

Cela permet de définir un ensemble de services visibles depuis l’extérieur (l’API : Application Programming Interface), sans se préoccuper de la façon dont ces services seront réellement implémentés.

 

Une classe qui implémente une interface doit obligatoirement implémenter chacune des méthodes déclarées dans l’interface, à moins qu’elle ne soit elle-même déclarée… abstraite !

 

Mais du coup, Classe abstraite ou interface ?

 

Classes abtraites et interfaces ont chacune une fonction bien distincte : les classes abstraites servent à factoriser du code, tandis que les interfaces servent à définir des contrats de service.

 

Et pourquoi ne pas utiliser des classes abstraites (dans lesquelles aucune méthode ne serait implémentée) en lieu et place des interfaces ? La réponse est simple : dans la plupart des langages actuels (c’est notamment le cas de Java, C#, PHP), il n’est possible pour une classe d’hériter que d’une seule classe parente (abstraite ou non), mais d’implémenter plusieurs interfaces.

 

Conclusion :

 

  • Les classes abstraites sont à utiliser lorsqu'une classe mère ne doit pas être instanciée.

 

  • Une classe abstraite ne peut donc pas être instanciée.

 

  • Une classe abstraite n'est pas obligée de contenir de méthode abstraite.

 

  • Si une classe contient une méthode abstraite, cette classe doit alors être déclarée abstraite.

 

  • Une méthode abstraite n'a pas de corps.

 

  • Une interface est une classe 100 % abstraite.

 

  • Aucune méthode d'une interface n'a de corps.

 

  • Une interface sert à définir un supertype et à utiliser le polymorphisme.

 

  • Vous pouvez implémenter autant d'interfaces que vous voulez dans vos classes.

 

  • Vous devez redéfinir toutes les méthodes de l'interface (ou des interfaces) dans votre classe.

 

  • Préférez encapsuler des comportements plutôt que de les mettre d'office dans l'objet concerné.

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *