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 :

Instancier une classe étendant une classe abstraite / Generics


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Instancier une classe étendant une classe abstraite / Generics
    Bonjour,
    Je cherche à jouer avec les types paramétrables de Java mais je n'arrive pas à faire ce que je veux.

    J'ai une classe abstraite Model étendue par d'autres classes possédant toutes un constructeur vide. Voilà ma classe Model dans l'idéal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public abstract class Model {	
    	Model(){
     
    	}
     
    	public static <T extends Model> T get(String id, XSession session) {
    		T m = null;
    		m = new T();
    		return m;
    	}
    }
    Sauf que je ne peux pas faire "m = new T();"

    Ce que je souhaiterais, c'est que la méthode "get" appelée par une des classes héritant de Model renvois un objet du type héritant.

    Par exemple une classe Member :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Member extends Model {
    	public Member(){}
    }
    Je souhaiterais que la méthode Member.get(String id, XSession session) me renvois un objet de type Member.

    Il y a peut-être quelque-chose du côté java.lang.reflect mais je n'ai pas réussi à trouver l'astuce.

    Merci d'avance.

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    en effet il faut passer par la réflexion.
    Un moyen de faire serait le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public static <T extends Model> T get(Class<T> clazz, String id, XSession session) {
    		T m = clazz.newInstance();
                    // ...
    		return m;
    	}

  3. #3
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par Rykian Voir le message

    Ce que je souhaiterais, c'est que la méthode "get" appelée par une des classes héritant de Model renvois un objet du type héritant.

    .
    deux remarques:
    - dans ton exemple get est statique .....
    - tu pourrais ne pas passer par un type paramétré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    abstract class Model {
       abstract Model get(....) ;
    }
     
    class MonModele extends Model {
      MonModele get(....) { // code } // covariance
    }

  4. #4
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    @Deaf: J'y avais déjà pensé, mais je ne vois pas l'intérêt de remettre le type de la classe dans la fonction vis-à-vis de la lisibilité du code.
    Le nom de la classe est déjà dans l'appel de la fonction statique.

    @professeur shadoko: J'ai allégé ma méthode get dans la classe Model pour ne pas surcharger le post. La méthode est un peu plus complexe que ça et je préférerais ne pas avoir a redéfinir à chaque fois la méthode get.


    Merci quand même à vous deux

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par Rykian Voir le message
    Le nom de la classe est déjà dans l'appel de la fonction statique.
    Par forcément, tu peux récupérer une instance de MonModele (héritant de Model) de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonModel instance = Model.get(MonModele.class, ...);
    D'ailleurs, je préfère largement accéder à une méthode statique là où elle a été définie, plutôt que de se servir de l'héritage.

  6. #6
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    L'idée de base en fait, c'était d'écrire le moins de code possible dans la classe étendant Model (En gros, juste la redéfinition de deux méthodes abstraites).

    J'vais aller voir du côté du StackTrace sinon. J'vous tiens au courant.

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par Rykian Voir le message
    J'vais aller voir du côté du StackTrace sinon.
    J'ai peur de comprendre, là. Tu comptes regarder d'où vient l'appel?

  8. #8
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    C'est ce que je voulais faire, mais de toutes façons ça ne marche pas puisqu'apparemment le stacktrace ne retourne que la classe dans laquelle la méthode est définie.

    Je ne veux pas faire peur aux futurs développeurs et stagiaires de ma boîte, c'est tout

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/07/2014, 18h41
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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