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 :

Interface ou classe abstraite ?


Sujet :

Langage Java

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Interface ou classe abstraite ?
    Bonjour,

    je voudrais savoir si quelqu'un avait une méthode pour savoir quand c'est mieux d'utiliser une interface plutot qu'une classe abstraite et inversement .

    Merci

  2. #2
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    une interface quand toute tes methodes doivent etre redefinies(possible avec classe abstraite).
    une classe abstraite quand tu peux ne modifier qu'une seule methode(impossible avec interface).
    qui dit Dieu n'existe pas dis que les programmes tournent sans processeur.

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,

    la classe abstraite t'empêche d'hériter d'autre chose que d'elle-même pour implémenter les méthodes abstraites

    l'interface, c'est un niveau supérieur d'abstraction, cela agit comme un genre de "greffe" de fonctionnalités diverses sur la classe qui l'implémente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Désigne une classe capable d'écouter la souris et des actions
    class MyClass implements MouseListener, ActionListener
    ... tandis qu'il est tout simplement impossible d'hériter en même temps de plusieurs classes (abstraites ou non)

    Les interfaces amènent un semblant d'héritage multiple (sous une forme dérivée, puisque qu'on hérite d'aucune implémentation)

    Les interfaces (bien utilisées) sont plus souples d'emploi, et plus puissantes (lorsqu'un algo traite avec des interfaces, il n'utilise qu'une description d'un fonctionnement: l'implémentation est complètement inconnue de l'utilisateur de l'interface, et peut donc être modifiée sans gêner personne)

    Les classes abstraites sont à utiliser lorsqu'une classe n'est pas terminée, par exemple pour déterminer les comportements communs à plusieurs classes, et ne laisser que les comportements spécifiques à chaque classe concrète sous forme de méthodes abstraites
    (ex pour un jeu d'échecs: 1 classe abstraite "Piece" et des classes Roi, Dame, Fou, Cavalier... qui en héritent)

    Le schéma que j'utilise souvent c'est:
    • 1 interface qui définit le comportement globale
      1 classe abstraite qui implémente l'interface et toutes les méthodes qui peuvent l'être
      Plusieurs classe finales qui héritent de la classe abstraite et implémentent le reste


    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Je voudrais également savoir s'il est possible de rédefinir une méthode d'une même classe en utilisant @Override.

    Par exemple si j'ai une classe Point qui a une methode modif,est ce que ceci est possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Point{
     
    public void modif(){...}
     
    @Override public void modif(){...}
    }

  5. #5
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Non il ne peut y avoir deux méthodes avec la même signature dans une classe.

    Sinon avec l'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Point p = new Point();
    //du code
    p.modif();
    Comment le compilateur saurais laquelle appeler?

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  6. #6
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    non effectivement on peut pas. et @overide ne sert pas du tout a ca

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Man_Utd
    Je voudrais également savoir s'il est possible de rédefinir une méthode d'une même classe en utilisant @Override.

    Par exemple si j'ai une classe Point qui a une methode modif,est ce que ceci est possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Point{
     
    public void modif(){...}
     
    @Override public void modif(){...}
    }
    C'est à cela que sert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /*
    COMMENTAIRES!!!
    */


  8. #8
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par Descent
    Non il ne peut y avoir deux méthodes avec la même signature dans une classe.

    Sinon avec l'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Point p = new Point();
    //du code
    p.modif();
    Comment le compilateur saurais laquelle appeler?
    C'est ce que je pensais ègalement mais dans l'énoncé d'un exo qu'on me demande de faire,il m'est donné une classe Tree avec des méthodes et on me demande d'écrire ces mêmes méthodes dans la classe.

    Je n'ai peut-être pas compris l'énoncé


    Une classe Tree implémente des arbres dont les noeuds (noeuds internes ou feuilles) contiennent une donnée de nom data (un int) et ont un nombre quelconque de fils.Pour éviter de stocker une liste de fils dans les noeuds sans fils (les feuilles),on utilise 2 classes Leaf et InternalNode.
    La classe Leaf représente les noeuds sans fils ayant un ou plusieurs fils .Dans les noeuds internes ,les fils sont représentés par un champ children de type List<Node>.
    La classe Tree comprend

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Tree {  
     private final Node root;  
     public String toString() { return root.toString();}  
     public int size() { return root.size();}  
     public boolean contains(int i) { return root.contains(i);}  
     ...........  
    }
    1)Expliquer brièvement pourquoi on a besoin d'un super-type Node

    2)Doit-on utiliser une interface ou une classe abstraite pour représenter le super-type Node?Justifier votre choix.

    3)Expliquer pourquoi il faut un constructeur dans la classe Tree qui prend en ragument la racine de l'arbre.Écrire le code correspondant.

    4)Indiquer l'ensemble des modificateurs de visibilité possibles pour la méthode size() de Node.

    5)Écrire les autres classes (déclarations ,champs et constructeurs).Attention aux modificateurs de visibilité.Par exemple le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<Node> listThree = new ArrayList<Node>();  
    listThree.add(new Leaf(5));  
    listThree.add(new Leaf(6));  
    List<Node> listOne = new LinkedList<Node>();  
    listOne.add(new InternalNode(3,listThree));  
    listOne.add(new Leaf(4));  
    Node one = new InternalNode(1,listOne);  
    Tree tree = new Tree(one);
    crée l'arbre ci-dessous(l'arbre est comme cela:
    l'arbre a pour racine 1 qui a trois fils 2,3,4(de gauche a droite), 3 a deux fils 5 et 6 )

    6)Écrire une méthode size() dans la classe Tree.La taille d'un arbre est son nombre de noeuds.
    Indiquer le code des méthodes à ajouter dans les autres classes.Utiliser l'annotation @Override.

    7)Expliquer pourquoi le constructeur d'InternalNode peut priendre en paramètre une List<?extends Node>.

    8)Écrire une méthode boolean contains(int i) dans la classe Tree.Cette méthode renvoie true si l'arbre contient un noeud dont la valeur du cham est data est i.Indiquer le code des méthodes à ajouter dans les autres classes.

    9)Écrire une méthode toString() dans la classe Tree.Cette méthode renvoie une forme préfixe de l'arbre.Sur l'exemple ci-dessus,on obtient 1 2 3 4 5 6.Indiquer le code des méthodes à ajouter dans les autres classes.

    10)Écrire une méthode boolean equals(Object o) dans la classe Tree.Cette méthode teste si l'objet passé en paramètre est un arbre égal a l'arbre this : meme forme ,et memes données.

    11)Écrire une méthode traverse dans la classe Tree qui renvoie la liste des noeuds (List<Node> ) en ordre préfixe.

    12)On ajoute le fait que la classe Tree implémente l'interface Iterable<Node>.Comment peut-on utiliser cette propriété?Donner un exemple.

    13)Indiquer quelle est la méthode à implémenter pour que la classe Tree respecte l'interface Iterable<Node>.Écrire le code correspondant

    14)Dans le but d'écrire une classe PrefixIterator qui parcourt l'arbre dans l'ordre préfixe(ordre identique à celui du toString()),quelle structure de données doit-on utiliser?

    15)Donner le code de la classe PrefixIterator.On implémentera la méthode void remove() pour dire qu'elle n'est pas supportée.

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par lunatix
    non effectivement on peut pas. et @overide ne sert pas du tout a ca
    Je sais,cela sert à redéfinir des méthodes mères par exemple la méthode toString() de Object mais l'énoncé d'un exo me demande d'utilser @Override sur des méthodes d'une même classe ,d'ou mon problème

Discussions similaires

  1. [Débutant] difference interface et classe abstraite c#
    Par saintjuste dans le forum C#
    Réponses: 10
    Dernier message: 31/01/2013, 12h16
  2. Réponses: 4
    Dernier message: 21/05/2010, 10h46
  3. différence entre interface et classe abstraite
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 29/03/2010, 11h36
  4. Interface ou classe abstraite ?
    Par cobolfingaz dans le forum C#
    Réponses: 6
    Dernier message: 15/07/2008, 17h21
  5. [POO] Différence entre Interface et classe Abstraite
    Par viviboss dans le forum Langage
    Réponses: 7
    Dernier message: 29/11/2006, 16h39

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