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

Java Discussion :

Hériter un constructeur d'une classe abstraite, possible ?


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut Hériter un constructeur d'une classe abstraite, possible ?
    Bonjour à tous,

    Tout d'abord, j'espère ne pas avoir fait hurler avec ce titre, mais je ne vois pas comment l'exprimer :-)

    J'essaie de coder une classe représentant le concept de graphe, à titre d'exercice.

    J'ai une classe abstraite Graph comprenant des méthodes telles que vertices() renvoyant l'ensemble des sommets, edges() renvoyant les arcs/arêtes, etc. J'ai aussi des classes Vertex et Edge.

    J'ai deux sous-classes abstraites DGraph et UGraph représentant respectivement les graphes dirigés et non-dirigés qui ne contiennent chacune
    qu'une méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public abstract class DGraph extends Graph {
      public boolean isDirected () {
        return true; // pour DGraph, ou false pour UGraph
      }
    }
    J'ai enfin des sous-classes concrètes de ces deux-là, avec lesquelles j'essaie diverses implémentation de la structure de graphe: liste d'adjacence, TreeMap, etc.

    Ces classes concrètes comportent des constructeurs créant un nouveau graphe vide ainsi que des méthodes permettant d'ajouter ou détruire un sommet, d'en joindre en ajoutant une arête, etc.

    Le problème est que je souhaite une méthode permettant de créer un graphe à partir de sa description dans un fichier. À la lecture de ce fichier, on peut construire le graphe en ajoutant des sommets et des arêtes au moyen de méthodes qui figurent dans les classes concrètes, ont la même signature, mais sont implémentées différemment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public Vertex add (String id) {
    }
    public boolean add (Vertex v) {
    }
    public boolean remove (String id) {
    }
    public boolean remove (Vertex v) {
    }
    public Edge join (Vertex v0, Vertex v1) {
    }
    public boolean remove (Edge e) {
    }
    J'aimerais donc avoir un constructeur à partir d'un fichier du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public TreeMapDGraph (String fileName, int fileType) {
      // fileType représente le choix d'un format de fichier, texte, xml...
    }
    mais sans avoir à le re-coder dans chaque sous-classe, puisqu'il fait appel à
    des méthodes partagées.

    Est-ce qu'il serait possible de la coder de façon unique dans la classe abstraite DGraph ou UGraph ? Je ne vois pas comment, car elle devrait sans doute avoir comme signature

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public DGraph (String fileName, int fileType) {
    }
    alors qu'au sein de cette méthode, il faudrait commencer par créer un graphe vide dépendant du sous-type, avant de le peupler.

    Je m'étais demandé si une solution ne serait pas d'avoir une méthode statique
    avec le graphe (vide) en argument:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public static void fillFromFile(DGraph G, String fileName, int fileType) {
    }
    Merci pour tout avis.

    Cordialement,

    G.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    dans le principe, tu peux tout à fait avoir un constructeur dans une classe abstraite et l'invoquer dans une classe héritant de cette classe abstraite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class Graph {
    public Graph (String fileName, int fileType) {
      ...
    }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class DGraph extends Graph {
    public DGraph (String fileName, int fileType) {
      super(fileName, fileType);
    }
    }
    Ensuite, dans le constructeur de ta classe Graph, tu vas avoir un code commun à toutes les abstraction en héritant, qui chargent chaque type de fichier (txt, xml, etc...). Mais ce code aura probablement besoin d'appeler des primitives de construction de graphe propre à chaque type de graphes (DGraph, UGraph), des méthodes de construction d'éléments de graphes, avec des contraintes propres à chaque type...

    Le principe c'est d'indiquer dans la classe abstraite mère les prototypes de ces primitives

    genre par exemple (je donne un exemple bidon) :

    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
    public abstract class Graph {
    public Graph (String fileName, int fileType) {
      ...
      switch(fileType) {
         case TXT:
           lire informations de node
           break;
         case XML:
           lire informations de node
           break;
       }    
      node = createNode(informations de node);
     
    ...
     
    }
    }
     
    protected abstract AbstractNode createNode(des information qui décrivent un node) ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public abstract class DGraph extends Graph {
    public DGraph (String fileName, int fileType) {
      super(fileName, fileType);
    }
     
    // et ici l'implémentation concrète pour un graphe de type DGraph
    protected AbstractNode createNode(des information qui décrivent un node) ;
     
        return new ... ;
     
    }
    L'implémentation concrète pouvant elle même appeler des méthodes dont le prototype abstrait peut être imposé par Graph, ou par DGraph...

Discussions similaires

  1. Comment faire une classe abstraite avec un constructeur
    Par zemzoum89 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/10/2010, 00h01
  2. Réponses: 4
    Dernier message: 11/04/2008, 11h36
  3. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  4. Réponses: 2
    Dernier message: 27/03/2005, 16h09
  5. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05

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