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 Java Discussion :

[Débutant] classe abstraite ou interface


Sujet :

Langage Java

  1. #1
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut [Débutant] classe abstraite ou interface
    Salut à tous et à toutes

    je suis débutant en java, et j'ai récemment fait face à la notion d'interface : j'ai compris que c'est une "classe particulière" dont tous les membres sont static final, et les méthodes sont abstract..

    ma question : quand on fait face à un cas comme celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    abstract class maClasse{
        final static int i=1;
        abstract void afficher();
    }
    c'est à dire que maClasse peut être remplacée par une interface, on opte pour une classe abstraite ou une interface ?

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    L'un des intérêts d'une classe abstraite (corrigez moi si je me trompe) est d'éviter la duplication de code dans les classes filles.
    Ici, tu n'as "pas besoin" d'une classe abstraite(sauf si afficher() fait la même chose dans toutes les classes filles) .

    Je pense que tu peux passer à une interface.

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  3. #3
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    merci pour la réponse

    Citation Envoyé par mavina Voir le message
    L'un des intérêts d'une classe abstraite (corrigez moi si je me trompe) est d'éviter la duplication de code dans les classes filles.
    je pense que c'est l'avantage de l'héritage en général.. les classes abstraites servent (à mon avis bien sûr) à imposer l'implémentation de méthodes dans des classes dérivées..

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Oui, donc ici tu n'as pas besoin d'une classe abstraite si afficher() fait des choses différentes.

    Fred

    edit:quel était l'objet du doute au passage ? Parceque tu n'as pas l'air de douter en fait
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Et pourquoi pas les deux !!!

    Perso j'ai bien le principe des 3 niveaux :
    • Une interface qui définit le contrat général sans préciser d'implémentation.
    • Une ou plusieurs classes abstraites qui implémentent l'interface et propose une implémentation spécifique "partielle".
    • Et enfin les classes concrètes qui seront réellement utilisées, et qui hérite des classes abstraites...


    On retrouve ce principe dans l'API de Collections (par exemple : List -> AbstractList -> ArrayList).

    Citation Envoyé par mavina Voir le message
    L'un des intérêts d'une classe abstraite (corrigez moi si je me trompe) est d'éviter la duplication de code dans les classes filles.
    Il y a aussi la possibilité d'y définir des méthodes protected/package-only : toutes les éléments d'une interface sont implicitement public


    a++

  6. #6
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par Chatbour Voir le message
    Salut à tous et à toutes

    je suis débutant en java, et j'ai récemment fait face à la notion d'interface : j'ai compris que c'est une "classe particulière" dont tous les membres sont static final, et les méthodes sont abstract..
    Toutes les methodes d'une interface sont effectivement sans corps.
    Tu utilises une interface pour obliger les classes qui l'implémentent de redéfinir toutes ses méthodes sinon le compilateur signale une erreur.
    Par exemple la méthode sort de la classe Arrays accpete un tableau d'objets d'une classe qui implemente l'interface Comparable et doit par conséquent redéfinir la méthode compareTo.
    Exemple:
    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
     
    class Person implements Comparable
    {
      ....
      private int id;
     
     public Person(int id, String name){
      ....
    }
     
    /* Si on veut que les objets Person soient trié par id on definit la methode
    compareTo ainisi : */
     
    public int compareTo(Object o){
     
      Person otherPerson  =  (Person) o;
    if (this.id ==  otherPerson.id ) return 0;
    if (this.id >  otherPerson.id ) return 1;
    (this.id <  otherPerson.id ) return -1;
     
    // ou tout simplement return (this.id - other.id);
     
    }
     
    ...
     
    }
    La méthode sort sait qu'une classe implémentant l'interface Comparable avait forcement redéfinit compareTo et elle se contente de l'appeler.

    On pourrait bellement créer une classe abstraite qui définit une méthode abstraite CompareTo et faire en sorte que notre classe Person hérite de cette classe et fournit un corps pour compareTo et que la méthode sort accepte des objets qui étendent cette classe mais l'avantage est qu'en java on peut implémenter un nombre théoriquement illimité d'interfaces tandis qu'on ne peut hériter que d'une seule classe.

    Les classes abstraites sont utilisées pour rassembler le maximum de traitement que ses sous classes en ont besoin.
    Par exemple pour deux classes Student et Teacher qui ont chacune des méthodes getId et getName et getSalary on peut créer une classe abstraite Person :

    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
     
    abstract class Person {
     
    private int id;
    private String name;
     
    // cette méthode n'est pas abstraite
    public int getId() {
       return id;
    }
     
    // cette methode l'est aussi
    public String getName()
    return name;
    }
    // On évite ainsi la réecriture du code pour chacune des sous classes
     
    /* Mais cette méthode est abstraite car chaque sous classe a besoin de la définir à sa manière : */
    public abstract int getSalary();
    Les sous classe n'ont besoin de définir que la méthode getSalary().

    J'espèreque j'ai été clair.
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  7. #7
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Je suis d'avis d'utiliser toujours des interfaces quand cela est possible (et meme d'en abuser).

    A partir du moment où une classe peut avoir une variante qui puisse faire la meme chose il faut une interface.

    On peut meme arriver a faire la structure d'un programme qu'avec des interfaces. Libre au developpeur d'en faire des implementations diverses.
    La maintenance est grandement simplifier si on manipule les objects que par des interfaces.

    Cette facon de faire est utiliser par GeoApi par exemple, cette librairie est faite presque exclusivement d'interface. Ensuite d'autres librairies comme GeoTools ou des logiciels comme GvSIG,UDIG,Geoserver ...etc... implementent ces interfaces. Ces interfaces sont en realité des transpositions en code des normes iso et ogc, tout le monde est gagnant a les utiliser. L'interopérabilité des outils est aussi grandement amélioré.
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  8. #8
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par eclesia Voir le message
    Je suis d'avis d'utiliser toujours des interfaces quand cela est possible (et meme d'en abuser).

    A partir du moment où une classe peut avoir une variante qui puisse faire la meme chose il faut une interface.

    On peut meme arriver a faire la structure d'un programme qu'avec des interfaces. Libre au developpeur d'en faire des implementations diverses.
    La maintenance est grandement simplifier si on manipule les objects que par des interfaces.
    A mon avis, en utilisant les interfaces, on finit souvent par tirer partie des avantages de l'héritage multiple tout en évitant sa complexité (et parfois inefficacité ) inhérente.
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  9. #9
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    merci beaucoup les gars

    Amine_sas, merci pour l'explication étendue

  10. #10
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Voila ma vision des choses:

    Une interface décrit le contract général d'un "type" d'objets, ce contract est composés de deux grandes familles de méthodes
    - les business
    - les techniques (gestion des listeners, sécurités, affichage, etc...)

    La ou les classes abstraites implémentant l'interface vont donner une implémentation par défaut (bien souvent suffisante) pour toutes les méthodes techniques (gestion des listeners).

    De plus la classe abstraite peut fournir des méthodes suplémentaires (protected) permettant d'aider sensiblement l'implementation des classes réélles (exemple: les fireXXX() pour la gestion des listeners)

    Les classes réélles pourront ainsi deriver de la classe abstraite et se concentrer sur le "métier" de l'objet.

    Avec cette méthodologie, puisque tu possédes malgrés tout une interface tu pourras malgrés tout faire implémenter ton contrat général à un objet pour lequel son héritage ést déja imposé par ton architecture.

    Bien sur, des classes abstraites peuvent donner des implémentations par défaut de méthodes dites "business", tout dépends ensuite de la conception et l'architecture choisie, il s'agissait que de donner un exemple.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Classe abstraite ou Interface
    Par weabow dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 11/05/2014, 08h05
  2. Classe abstraite et interface
    Par ender91 dans le forum Langage
    Réponses: 6
    Dernier message: 15/06/2007, 11h46
  3. Réponses: 5
    Dernier message: 28/03/2007, 17h28
  4. Réponses: 6
    Dernier message: 20/03/2007, 10h51
  5. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02

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