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 :

Override le type d'une super classe typée ?


Sujet :

Langage Java

  1. #1
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut Override le type d'une super classe typée ?

    Je travaille actuellement sur un projet d'Eclipse RCP et j'ai les classes suivantes qui sont interne à Eclipse (donc je ne peux/doit pas les modifier).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //Classe générique pour définir une commande dont la sortie est lue via une classe de type V
    public class CLICommand<V extends MIInfo> {
        ....
    }
     
    //classe définissant la commande pour avoir les infos sur les threads
    public class CLIInfoThread extends CLICommand<CLIInfoThreadInfo> {
        ....
    }
     
    //classe pour lire la sortie de la command CLIInfoThread
    CLIInfoThreadInfo extends MIInfo {
        ....
    }
    J'ai besoin de lire la sortie différement que ce que fait Eclipse. Pour cela j'ai créé une classe qui étend CLIInfoThreadInfo. (dedans je parse la sortie console différement, bref).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //classe perso pour lire la sortie des infos thread
    public class CustomCLIInfoThreadInfo extends CLIInfoThreadInfo {
        ....
    }
    Mon problème est que je ne peux modifier la classe CLIInfoThred pour indiquer que le type de CLICommand n'est plus CLIInfoThreadInfo mais CustomCLIInfoThreadInfo.

    Sachant que je veux conserver le corps de la classe CLIInfoThred j'ai d'abord pensé à creer une sous-classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //classe fille de CLIInfoThred
    public class CustomCLIInfoThread extends CLIInfoThread {
        ....
    }
    Seulement je ne peux définir que le typage de la super-super classe doit être différent. Y a-t-il un moyen de le définir ici ?

    Pour l'instant je contourne le problème en créant une classe parallèle à CLIInfoThred ce qui me permet de définir le typage. Mais cela duplique le code car le corps de ma classe parallele est le même que celui de CLIInfoThred.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //classe parallèle à CLIInfoThred
    public class CustomParallelCLIInfoThread extends CLICommand<CustomCLIInfoThreadInfo> {
        ....
    }
    Y a-t-il une meilleure solution ?
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  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,

    On peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MaSuperClasse {
         public MonSuperType get() {
                return [...]
         } 
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MaClasseFille extends MaSuperClasse {
         @override
         public MonTypeFils get() {
                return [...]
         } 
    }
    si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class MonTypeFils extends MonSuperType {
    }
    sinon ça n'a aurait aucun sens et ça pourrait faire planter Eclipse si on lui fourguait une instance de classe qui n'est pas celle prévue.

    [edit]et ça fonctionne aussi si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MaClasse<T> {
     
    	public T get() {
    		return null;
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class MaSuperClasse extends MaClasse<MonSuperType> {
     
     
    }

    Et faire un adapteur, ça ne serait pas mieux, plutôt que de t'introduire dans ce que fait Eclipse ? Après, tu peux toujours ajouter tes méthodes qui retournent tout ce que tu veux sur une classe fille d'une autre classe, tu le sais, c'est toi qui le gère, et si c'est un problème de synchro de données, tu peux faire l'adapteur uniquement sur l'attribut.

    Mettons que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class MaSuperClasse {
        public UnSuperType get() {
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class MaClasseFille extends MaSuperClasse{
     
        private MonType montruc = new MonType(get());
     
        public MonType getMonTruc() {
             return montruc;
        }
     
    }
    En revanche, si l'instance retournée par get() peut changer, ça ne fonctionnera pas. Il faudrait éventuellement faire :

    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
    public class MaClasseFille extends MaSuperClasse{
     
        private MonType montruc = new MonType() {
     
             protected UnSuperType getSuperTypeInstance() { // une méthode prévue dans la classe MonType (abstraite) pour avoir l'instance de MonSuperType
                  return get();
             }
     
        };
     
        public MonType getMonTruc() {
             return montruc;
        }
     
    }
    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.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/08/2017, 17h58
  2. [Modèle Relationnel] Faire une table par type ou une table des types ?
    Par jax54000 dans le forum Schéma
    Réponses: 12
    Dernier message: 18/11/2009, 11h43
  3. Representer un type d'une autre classe dans le diagramme de classe.
    Par Hello_World dans le forum Diagrammes de Classes
    Réponses: 5
    Dernier message: 07/05/2009, 23h58
  4. Attribut d'une classe du type d'une autre classe
    Par Ragnarok666 dans le forum Débuter
    Réponses: 12
    Dernier message: 14/04/2009, 17h43
  5. [Free Pascal] [2.2] Impossible d'assigner une variable de type T à une variable de type T
    Par Hibou57 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 12/10/2007, 12h31

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