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 :

Static abstract


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut Static abstract
    Bonjour,
    J'ai un petit probleme au niveau de ma modélisation du a certaines restrictions de java.
    Je souhaiterai imposer la redéfinition lors de mon heritage d'une methode static.
    exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public abstract class A {
          public static abstract A create(); // le probleme est la
    }
     
    public class B extends A {
          public static final B create() {
               return new B();
          }
    }
    Comment obliger à redéfinir create() en gardant le caractère static ?

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    a tu essayer sans le final ??? (dans la class B )

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    précision : A DOIT etre abstraite !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    le probleme n'est pas la il vient que je ne peux pas declarer une methode abstraite static

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut Re: Static abstract
    Salut,

    Une méthode static ne peut pas être hérité puisqu'elle n'est pas lié à une instance de la classe... Il est donc impossible d'utiliser les concepts d'héritages...

    Que veux-tu faire exactement ?

    a++

  6. #6
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Tu ne peux pas, et cela n'a d'ailleurs pas tellement de sens de vouloir faire ca. Ton code ressemble a un design pattern de type fabrique abstraite.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    J'utilise cette astuce pour un callback etant donné que dans une classe generic on ne peut pas instancier la classe passé en parametre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public class C<T extends A> {
                public C() {
                    new T();            // je pensais faire un T.create()
                }
         }

  8. #8
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Tu vas faire quoi avec ton generic ? Sinon tu peux passer un type Class et l'instancier par reflection.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Normalement j'ai une classe generique (SessionManager) qui est censée créer des objets du type passé en paramètre (SessionType1|SessionType2|...) (ce n'est pas une factory).
    je ne souhaite pas avoir a faire d'héritage sur le SessionManager etant donné que son fonctionnement est strictement identique quelque soit le type de session. Mais voila je ne peux pas faire de new sur le parametre.

    Par reflexion ?

  10. #10
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Tu passes en parametre la classe, par exemple SessionType1.class et tu vais classePasseEnParam.newInstance(); Tu peux aussi passer le nom de la classe dans une String et faire Class.forName() puis newInstance(). C'est le procede de reflection (je l'ecris en anglais pour le distinguer du mot francais reflexion .

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Merci Terrible !!!!
    Je teste...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Mauvaise nouvelle
    Il semblerait que java ne veuille pas faire d'Introspection sur des paramètres de generic :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
           class SessionManager<T extends Session> {
                public SessionManager () {
                   T.class.getName() // SessionMonitor.java:44: cannot select from a type variable
     
                }
            }
    Que faire...

  13. #13
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Oui c'est normal. Fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
           class SessionManager {
                Session instance;
     
                public SessionManager (Class sessionClass) {
                   instance = (Session) sessionClass.newInstance();
     
                }
     
                public Session getInstance() {
                  return instance;
                }
            }

  14. #14
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Stulti
    Il semblerait que java ne veuille pas faire d'Introspection sur des paramètres de generic :
    C'est normal le type des Generics est perdu lors de l'exécution... Il faut donc utiliser un paramètre de type Class comme dans l'exemple de Gfx.

    Tu peux aussi utiliser les Generics sur cet exemple pour sécuriser un peu plus le code (en empechant de créer un SessionManager avec un type Class incorrect) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class SessionManager<T extends Session> {
    	T instance;
     
    	public SessionManager (Class<T> sessionClass) {
    		instance = (T) sessionClass.newInstance();
     
    	}
     
    	public T getInstance() {
    		return instance;
    	}
    }
    a++

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Ca fonctionne, Merci

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

Discussions similaires

  1. [PHP 5.3] abstract static function génère un E_STRICT, pourquoi?
    Par glen1789 dans le forum Langage
    Réponses: 11
    Dernier message: 15/05/2012, 21h44
  2. [PHP 5.3] Créer une méthode abstract static.
    Par Rakken dans le forum Langage
    Réponses: 2
    Dernier message: 01/05/2011, 15h32
  3. Abstract / Static : pb conception.
    Par Bacteries dans le forum Langage
    Réponses: 24
    Dernier message: 07/09/2009, 14h37
  4. Une méthode "abstract static" ?
    Par Exsilius dans le forum C#
    Réponses: 4
    Dernier message: 01/02/2007, 14h05
  5. static abstract (bis)
    Par NéalZheimer dans le forum Langage
    Réponses: 1
    Dernier message: 24/07/2006, 01h12

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