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 :

Cast et Factory


Sujet :

Langage Java

Vue hybride

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut Cast et Factory
    Bonjour à tous,

    Je suis face à un petit problème :

    J'ai une classe abstraite Mere , dont dérive plusieurs classe Fille :

    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
    37
    abstract class Mere()
    {
    	public enum Types {
    		TYPEA,
    		TYPEB
    	}
     
    	protected Types mType;
     
    	abstract public String getStr();
    }
     
    class FilleA extends Mere()
    {
    	public FilleA() {
    		super();
    		mType = Types.TYPEA;
    	}
     
    	@Override
    	public String getStr() {
    		return "Fille A";
    	}
    }
     
    class FilleB extends Mere()
    {
    	public FilleB() {
    		super();
    		mType = Types.TYPEB;
    	}
     
    	@Override
    	public String getStr() {
    		return "Fille B";
    	}
    }
    Mon code génère un ArrayList<Mere> à partir de plusieurs appel à une factory :
    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
    public class FilleFactory
    {
        public static Mere getFille(Mere.Types type)
        {
     
            if(type.equals(Mere.Types.TYPEA))
            {
                return new FilleA();
            }
            else if (type.equals(Mere.Types.TYPEB))
            {
                return new FilleB();
            }
            else
            {
                throw new IllegalArgumentException("Bad Type");
            }
        }
     
        private FilleFactory(){}
    }
    j'ai donc à ma disposition un tableau de plusieurs Mere (différente FilleA,B,C ...) avec chacune leur propre type.

    A un moment donné j'extrait une classe Fille de ce tableau pour m'en servir.
    J'ai alors besoin d'appeler la méthode getStr()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mere obj = tab.get(10);
    obj.getStr();
    Comment faire en sorte de caster objdans le bon type Fille pour être capable d'appeler la bonne méthode getStr() sachant que le type de ma classe est lié à l'attribut mType ?

    Suis je obligé de passer tout en revu ? du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(obj instanceof FilleA)
        (FilleA)obj.getStr();
    sachant que je peux avoir plusieurs dizaine de types Fille différents , j'ai un peu peur de la tournure que le code risque de prendre.

    Merci pour vos conseils
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Citation Envoyé par grunk Voir le message
    Comment faire en sorte de caster objdans le bon type Fille pour être capable d'appeler la bonne méthode getStr() sachant que le type de ma classe est lié à l'attribut mType ?
    Tu n'as pas besoin, c'est du polymorphisme de base ça...

    Ta classe Mère possède une méthode abstraite, donc l'implémentation dépendra de l'instance de la classe fille que tu récupères, et tu n'as pas besoin de te poser de questions à ce sujet.


    Après, ton code ne compilera pas pour plusieurs raisons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Mere() // trop de parenthèses
    class FilleA extends Mere(){ // il y a des parenthèses en trop ici
    ...
     
    (FilleA)obj.getStr(); // types incompatibles. getStr renvoie un objet de type String, tu ne peux pas le caster en FilleA
    ((FilleA)obj).getStr(); // là ça marche... mais ça ne sert à rien vu que ça fait la même chose que obj.getStr()
    Dernier point : ta classe abstraite n'a que des méthodes abstraites de définies... Ce qui souvent veut dire qu'on est en train de décrire une interface plus qu'une classe, du coup tu pourrais faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public interface Mere {
     
     	Types getType();
     
    	public String getStr();
    }
    Tu sors ton énumération de ta classe abstraite (parce que c'est bizarre qu'une classe abstraire "connaisse" les types de ses classes filles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	public enum Types {
    		TYPEA,
    		TYPEB
    	}
    Et tu changes un peu ton factory
    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
     
    public class FilleFactory
    {
        public static Mere getFille(Types type) {
    		switch (type) {
    		case TYPEA:
    			return new FilleA();
    		case TYPEB:
    			return new FilleB();
    		default:
    			throw new IllegalArgumentException("Bad Type");
    		}
    	}
     
    	private FilleFactory(){}
    }

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Au temps pour moi ça marche effectivement depuis le début, l'erreur venait d'autre chose -_-'

    PS : tes remarques était surtout des fautes de frappe
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    A noter qu'on peut fusionner fabrique et type énuméré (du coup, plus besoin fabrique avec méthode statique — par contre, ça met un lien fort entre types et implémentation ) :

    En plus avec Java 8, ça se fait très simplement (ce qui supprime en plus tout switch, pour faire un code beaucoup plus simple, surtout pour ajouter des types) :

    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
    public enum Types {
     
    	TYPEA(()-> new FilleA()),
    	TYPEB(()-> new FilleB()),
    	;
     
    	private final Supplier<Mere> factory;
     
    	private Types(Supplier<Mere> factory) {
    		this.factory=factory;
    	}
     
    	public Mere newInstance() {
    		return factory.get();
    	}
     
    }
    Avec pour appel pour créer une instance de type TYPEA:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Types.TYPEA.newInstance()
    Avant Java 8 :

    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
    public enum Types {
     
    	TYPEA,
    	TYPEB,
    	;
     
    	public Mere newInstance() {
    		switch(this) {
    		case TYPEA:
    			return new FilleA();
    		case TYPEB:
    			return new FilleB();
    		default:
    			throw new IllegalStateException("Not supported type: " + this);
    		}
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. [VB.NET] Cast d'une tablecell
    Par Pari dans le forum ASP.NET
    Réponses: 6
    Dernier message: 05/05/2004, 15h58
  2. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 10h46
  3. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 15h00
  4. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 12h07
  5. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49

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