IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

méthode abstraite ou méthode d'interface


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    Juillet 2006
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 326
    Points : 345
    Points
    345
    Par défaut méthode abstraite ou méthode d'interface
    Salut,

    une méthode abstraite dans une classe (abstraite ou pas) ,
    on la déclare , on ne l'implémente pas ,
    c'est comme une méthode dans une interface

    Qu'est-ce qui justifie que vous penchez pour une méthode abstraite
    plutot qu'une méthode dans une interface ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    On va commencer par la partie évidente :

    Interface :
    • On peut en implémenter plusieurs
    • Methode forcément publique



    Classe abstraite :
    • Pas d'héritage multiple
    • Méthode au choix private, protected ou public


    Ca donne déjà une première idée sur qui choisir en fonction du besoin.

    Ensuite d'un point de vue plus conceptuel :

    Une interface est complètement indépendante de la classe qui l'implémente. Par exemple une interface "OnMoveEvent" peut indépendamment être implémenté par une classe "Poney" et une classe "Voiture" qui n'ont pourtant rien en commun si ce n'est le besoin de se deplacer().
    Au contraire une classe/méthode abstraite impose un lien entre les classes. Ca n'a par exemple pas de sens de surcharger une classe abstraite "Mammifère" dans une classe "Voiture" même si cette classe abstraite à une méthode deplacer() qui pourrait nous intéresser.

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Sur le même principe :
    Techniquement : tu as du code implémenté dans une classe Abstraite, qui sera commun à tous les enfants, alors qu'une Interface ne contient que des définitions. Tu peux même avoir des interfaces sans méthodes, qui sont uniquement pour marquer la classe (mais là, c'est un peu extrême comme utilisation)

    Conceptuellement : une interface, c'est un contrat qui dit "la classe qui implémente cette interface va faire ça", alors qu'une classe abstraite c'est une implémentation partielle, à laquelle il manque un morceau spécifique. C'est pour ça qu'on peut implémenter plusieurs Interface, mais surcharger une seule classe abstraite.

    Exemple (code non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    interface FileReader {
        public function lireFichier($filePath);
    }
     
    abstract class AbstractTextFileReader implements FileReader {
        public function lireFichier($filePath) {
            if (($handle = fopen("test.csv", "r")) !== FALSE) {
                $data = lireContenuFichier($handle);
                fclose($handle);
            }
            return $data;
        }
     
        abstract protected lireContenuFichier($handle);
    }
     
    class CsvFileReader extends AbstractTextFileReader {
     
        protected lireContenuFichier($handle) {
            $data = [];
            while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $data[] = $row;
            }
            return $data;
        }
    }
     
    class SimpleTextFileReader extends AbstractTextFileReader {
        protected lireContenuFichier($handle) {
            $data = [];
            while (($line = fgets($handle) !== FALSE) {
                $data[] = $line;
            }
            return $data;
        }
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/01/2009, 22h38
  2. Interfaces/Classes abstraites et méthodes statiques
    Par Zakapatul dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/01/2009, 15h38
  3. Réponses: 14
    Dernier message: 17/11/2006, 20h17
  4. Les méthodes abstraites et les interfaces
    Par ETI-trian dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2006, 13h14
  5. Réponses: 6
    Dernier message: 27/07/2005, 10h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo