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 :

[1.5] Vector et héritage


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut [1.5] Vector et héritage
    Bonjour,

    alors, je vais essayer de faire clair.
    Mon problème est le suivant :

    • J'ai une classe, Controller pour ne pas la nommer, qui fait plein de choses, gère des évènements sur ses propriétés etc...bref...qq truc sympas qui m'evite de les refaires a chaque fois. Cette classe n'est pas abstraite, (mais a priori, si besoin elle peut le devenir

    • J'ai une autre classe, ControllerList qui, elle, hérite de Vector<Controller>.
      j'ai réimplémenté qq méthodes, comme add et remove, pour y rajouter un comportement particulier.

    tout ca marche très bien, mais la ou ca fait ce que je veux, c'est quand je fais une classe qui hérite de mon Controller, par exemple MyController, sur laquelle je rajoute qq méthodes mais le fonctionnement de l'objet reste le meme que celui d'un Controller, et une autre classe qui hérite de mon ControllerList, MyControllerList.

    En fait j'aimerais que MyControllerList soit en fait un ControllerList<MyController> pour que quand je fasse ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MyControllerList myList = new MyControllerList();
    MyController controller = new MyController();
    myList.add(controller);
     
    //a la récupération je veux pouvoir récupérer un MyController directement, 
    //sans cast, comme ceci :
    controller = myList.get(0);
     
    //or la je suis obligé de casté, car MyControllerList héritant de ControllerList,
    //il me renvoie constament un Controller
    controller = (MyController) myList.get(0);
    voila...en gros je veux éviter le cast, en profitant de l'héritage de ControllerList.

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

    voila merci d'avance

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Depuis Java 1.5 il est possible de modifier le type de retour d'une méthode redéfinie, cf La covariance dans le JDK1.5.

    Il te suffit donc de redéfinir la méthode get() de la classe MyControllerList.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public MyController get(int index) {
        return (MyController) super.get(index);
    }
    Par contre attention aux diverses méthodes d'ajout qui permettent toujours d'ajouter un Controller qui n'est pas un MyController ce qui déclencherait une erreur lors de la récupération de l'élément.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    je voulais justement eviter de redefinir chaque méthode de l'héritant, je pensais qu'avec la definition bien faite, ca suffirait a faire en sorte que le get me renvoie le bon objet.

    mais si c'est la seule méthode...

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Ce que tu peux faire c'est laisser les générics au type ControllerList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ControllerList<T extends Controller> extends Vector<T>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyControllerList extends ControllerList<MyController>
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyControllerList myList = new MyControllerList();
    MyController controller = new MyController();
    myList.add(controller);
    controler = myList.get(0);
    ou si tu veux pouvoir étendre MyControllerList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyControllerList<T extends MyController> extends ControllerList<T>
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyControllerList<MyController> myList = new MyControllerList<MyController>();
    MyController controller = new MyController();
    myList.add(controller);
    controler = myList.get(0);
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    voila..c'est ca que j'ai essayé et qui n'a pas marché....mais ma syntaxe ne devait pas etre bonne...

    merci bcp...j'essaie ca des que possible

  6. #6
    Membre éclairé Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Par défaut
    alors voila ce que ca me fait, parce que moi, dans mon ControllerList j'ai redefini qq methodes comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
    public Controller remove(int index) {
       Controller controller = this.get(index);
       controller.setState(State.DELETED);
       return controller;
    }
    alors que j'ai bien mis la signature de ControllerList comme tu précisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ControllerList<T extends Controller> extends Vector<T>
    il va me donner ca comme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Multiple markers at this line
    -the return type is incompatible with Vector<T>.remove(int)
    -overrides java.util.Vector<T>.remove
    et si je dis a ma méthode remove de renvoyer un objet de type T, bah...il admet pas que je fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
    public T remove(int index) {
       Controller controller = this.get(index);
       controller.setState(State.DELETED);
       return controller;
    }
    parce que controller n'est pas de type T..normal

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

Discussions similaires

  1. C++ héritage et vector iterator
    Par Wilgard dans le forum C++
    Réponses: 4
    Dernier message: 23/10/2012, 15h42
  2. Héritage, dynamic_cast et vector
    Par kassidy dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2010, 14h09
  3. héritage et stl::vector
    Par chollier dans le forum Débuter
    Réponses: 8
    Dernier message: 26/05/2010, 20h08
  4. Problème avec l'héritage et les vector
    Par Jayse dans le forum C++
    Réponses: 5
    Dernier message: 29/09/2008, 10h52
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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