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 :

[POO] Classes abstraites


Sujet :

Langage Java

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut [POO] Classes abstraites
    Salut

    J'ai un petit souci d'implémentation. Soit une classe Symbol abstraite. De cette classe, descendent 2 autres classes : Nucleotid et AminoAcid (c'est de la bioinfo, oui, oui, mais ne fuyez pas, s'il vous plait). J'ai une autre classe abstraite qui s'appelle Sequence. Or dans cette classe, j'ai écris des méthodes telles que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void setSequence(String seq){
    		char[]array = seq.toCharArray();
    		this.sequence = new java.util.ArrayList(array.length);
    		for(int i = 0; i<array.length; i++){
    			this.sequence.add(i, new Symbol(array[i]));
    		}
     
    	}
    Bien sûr, pour le compilo, je n'ai pas le droit d'écrire new Symbol(array[i]) car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cannot instantiate the type Symbol
    Donc, comment avoir recours à cette classe Symbol dans la classe Sequence pour rester le plus générique possible ?

    Merci d'avance de vos réponses.

    @++

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Juste une note, je vois déjà une première solution qui consiste à déclarer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected abstract void setSequence(String seq);
    Puis la définir dans les classes héritantes mais j'attends d'autres solutions.

    @++

  3. #3
    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
    je pense que cela est faisable avec la programmation generique, ;ais comme je n'y connais rien, je ne peux pas t'aider.

  4. #4
    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,


    Le problème ne vient pas de la classe Sequence mais de la classe Symbol. Comme elle est abstraite du ne peut pas l'instancier :
    Tu dois obligatoirement passé par une de ces classes filles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    new Nucleotid(array[i]);
     
    // ou bien 
     
    new AminoAcid(array[i]);
    Maintenant il faudrait savoir les différences entre Nucleotid et AminoAcid pour déterminer quand utiliser l'un ou l'autre... mais là cela dépasse mes compétences (mais je ne me suis pas enfuie... enfin pas encore )

    a++

  5. #5
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Attention !
    Une petite précision, mon cahier des charges m'impose de rester dans les spec Java 1.4.2 !
    Donc, pas de recours à Java 1.5 !

    @++

  6. #6
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Salut adiGuba.

    L'ennui c'est que de la classe Sequence découle les classes SequenceN (pour les acides nucléiques composés de nucléotides) et SequenceP (pour les protéines composées d'aminoacides). Finalement, un point de convergence entre nos deux solutions serait de créer ces classes SequenceN et SequenceP et de mettre la méthode décrite ci-dessus en abstract.
    Est-ce une bonne manière ?

    @++

  7. #7
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Bon, j'ai suivi ce que j'ai écrit tantôt. A la compilation, point de problème et ça me semble juste.
    Je met donc ce thread en Résolu.
    Merci à vous pour vos indications.

    @++

  8. #8
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Tu ne veux pas utiliser un DP Factory ???

  9. #9
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Koa ??? C'est quoi cette bestiole ? Ca se mange ???

    @++

  10. #10
    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
    Citation Envoyé par GLDavid
    Une petite précision, mon cahier des charges m'impose de rester dans les spec Java 1.4.2 !
    Juste pour information : la généricité a toujours été possible en Java ! Les Generics de Java 5.0 permettent seulement d'apporter une sécurité supplémentaire car le compilateur se charge de vérifier la cohérence du tout...


    Citation Envoyé par GLDavid
    Est-ce une bonne manière ?
    Oui ce serait une solution (si une SequenceN est bien composé uniquement de nucléotides et qu'une SequenceP uniquement d'aminoacides).

    Mais tu peux utiliser de la généricité, ce qui te permet de n'avoir qu'une seule implémentation de la méthode setSequence(), en utilisant une méthode createSymbol() abstraite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public abstract class Sequence {
     
    	protected abstract Symbol createSymbol(char c);
     
    	protected void setSequence(String seq){
    		char[]array = seq.toCharArray();
    		this.sequence = new java.util.ArrayList(array.length);
    		for(int i = 0; i<array.length; i++){
    			this.sequence.add(i, createSymbol(array[i]));
    		}
     
    	}
    }
    Et SequenceN et SequenceP implémenteront seulement la méthode createSymbol(), par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class SequenceN extends Sequence {
     
    	protected Symbol createSymbol(char c) {
    		return new Nucleotid(c);
    	}
    }
    Ceci bien sûr si les sequences ne contiennent qu'un seul type d'élément...

    a++

    PS : tu peux également utiliser la reflection pour créer les Symbol, mais le code est un peu plus lourd à coder...

  11. #11
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Si j'ai bien compris ton truc, tu veux garder le maximum d'abstraction et garder des classes de type Symbol. Une Factory est un objet java qui te renverra la bonne sous classe de Symbol en conservant l'abstraction et en voyant la classe sous forme Symbol.

    Je sais pas si j'ai été clair ?

    http://abrillant.developpez.com/tuto...oduction/#L3.1

  12. #12
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut Re: [POO] Classes abstraites
    Citation Envoyé par GLDavid
    Salut

    J'ai un petit souci d'implémentation. Soit une classe Symbol abstraite. De cette classe, descendent 2 autres classes : Nucleotid et AminoAcid (c'est de la bioinfo, oui, oui, mais ne fuyez pas, s'il vous plait). J'ai une autre classe abstraite qui s'appelle Sequence. Or dans cette classe, j'ai écris des méthodes telles que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void setSequence(String seq){
    		char[]array = seq.toCharArray();
    		this.sequence = new java.util.ArrayList(array.length);
    		for(int i = 0; i<array.length; i++){
    			this.sequence.add(i, new Symbol(array[i]));
    		}
     
    	}
    Bien sûr, pour le compilo, je n'ai pas le droit d'écrire new Symbol(array[i]) car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cannot instantiate the type Symbol
    Donc, comment avoir recours à cette classe Symbol dans la classe Sequence pour rester le plus générique possible ?

    Merci d'avance de vos réponses.

    @++
    Hello,

    J'ai lu tous les posts de ce thread. Je pense avoir compris la problematique... Donc je me risque à proposer une solution.

    Tu pourrais ecrire une classe factory de Symbole que tu passerais en parametre de ta methode setSequence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void setSequence(String seq,SymbolFactory symbolFact){
    		char[]array = seq.toCharArray();
    		this.sequence = new java.util.ArrayList(array.length);
    		for(int i = 0; i<array.length; i++){
    			this.sequence.add(i, symbolFact.getNewSymbol(array[i]));
    		}
     
    	}
    En instanciant ta factory tu lui indiquerais le type de symbol qu'elle doit créer.
    par exemple (ce n'est qu'un exemple à affiner peut etre) :

    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
     
     
    public class SymbolFactory {
     
    	private final String typeSelect;
     
    	public SymbolFactory(String symbolType)
    	{
    		typeSelect = symbolType;
    	}
     
    	public Symbol getNewSymbol(char[] array){
     
    			//	soit par un system switch case sur le typeSelect
     
    			 // ou alors par instanciation dynamique
    			 //tu peux generer des symboles à la demande
     
    	}
    }
     
     
    }
    Cela te permettrai de rester générique par rapport à ta classe Symbol et Sequence.

    Maintenant pour le renseignement des différents symboles disponibles dans ta factory, tu peux gérer ca de manière externaliser dans un fichier, xml par exemple. cela te permettrai de pourvoir rajouter des types de symbole sans modifier le code de ta factory.

    Voila j'espère que cela répondra à ton besoin, si tu as des questions n'hesites pas!!


  13. #13
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Merci à tous pour vos réponses !
    Ca va me permettre d'affiner mon code !!!
    Et puis, cela me sera une excellente introduction aux Design Patterns.

    @++

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

Discussions similaires

  1. [POO] Classe abstraite et attributs
    Par Info-Rital dans le forum Langage
    Réponses: 1
    Dernier message: 12/08/2007, 13h28
  2. [POO] classe abstraite sans methode
    Par ZaaN dans le forum C++
    Réponses: 7
    Dernier message: 01/05/2007, 19h21
  3. [POO] Classe abstraite PHP5 et variables membres
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 01h27
  4. [POO] class abstraite CRUD & DAO
    Par mazenovi dans le forum Langage
    Réponses: 2
    Dernier message: 13/04/2006, 19h45
  5. [POO] class abstraite et methode magic
    Par jeff_! dans le forum Langage
    Réponses: 14
    Dernier message: 24/01/2006, 23h19

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