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 :

Conception: héritage d'une classe abstraite


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut Conception: héritage d'une classe abstraite
    Bonjour,
    Je me pose la question suivante, quelle est la meilleure manière de développer le cas suivant :
    - une classe abstraite n'a pas de valeur pour un certain champs
    - les enfants (qui sont plusieurs ) ont ce champs et il a une valeur
    - ce champs est final
    - le getChamps fait toujours la même chose

    Feriez vous :

    1)
    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
    abstract class 1{
        final int idType;
    ...
        public getIdType(){
            return idType;
        }
        protected 1(int idType){
            this.idType = idType;
        }
    }
    class 2 extends 1{
    ...
        public 2(){
            super(valeur_de_l'id_type);
        }
    }
    ou :

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    abstract class 1{
        public abstract getIdType();
    }
    class 2 extends 1{
        final int idType = 5;
    ...
       public getIdType(){
            return idType;
        }
    }
    Ou autre chose ?

    Dans le 1) ce qui m'embete c'est qu'on perd en lisibilité et qu'on définit la variable final dans le constructeur, et dans le 2) c'est de devoir écrire n fois la même fonction getIdType(), bref aucune des deux solutions ne me satisfait.

    Que feriez vous ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Bonjour
    Moi je rendrais plutôt le champ protected pour qu'il soit hérité par les sous classes, et donc elles pourront l'initialiser dans leur constructeur. Ce serait quelque chose comme :
    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
     
    abstract class 1{
        protected final int idType;
    ...
        public getIdType(){
            return idType;
        }    
    }
     
    class 2 extends 1{
    ...
        public 2(int val){
            this.idType = val;
        }
    }
    Je ne l'ai pas testé, donc je ne sais pas si le fait que le champ soit final pourrait faire que le code ne donne pas le résultat attendu. Si tu peux me donner un retour pour ça.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Bon, je viens de tester rapidement le code que j'ai donné ci-dessus, et comme je le soupçonnais, il y a effectivement une erreur de compilation due au fait que le champ est final et ne peut plus être assigné une nouvelle fois dans les sous-classes. Donc pour que la solution marche, il faudrait enlever le modificateur final pour le champ. Cela étant, puisque c'est une question de conception, je me demande pourquoi tu as besoin que ce champ soit final, il suffirait qu'il soit private et que la classe ne fournisse que la méthode "getChamp". Et comme il n'y aurait pas de "setChamp", il n'y aurait aucune chance qu'une nouvelle valeur soit affectée à ce champ de l'extérieur de la classe, donc tout resterait sous contrôle.
    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
     
    abstract class 1{
        private int idType;
     
        protected 1 (int val){
             this.idType = val;
        }
        public int getIdType(){
            return idType;
        }    
    }
     
    class 2 extends 1{
    ...
        public 2(int value){
            super(value);
        }
    }
    Voilà ce que je peux en dire. Sinon, pour les deux solutions que tu as proposées, la première me satisferait plus que la deuxième.

  4. #4
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    De même, je pense que la première solution est meilleure.
    J'aurai cependant combiné private et final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public abstract class AbstractClass {
    
    	private final int var;
    	
    	protected AbstractClass(int var) {
    		this.var = var;
    	}
    	
    	public final int getVar() { return var;}
    }

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Je pense que tu as raison de mettre final la méthode "getVar" , ça empêcherait toute redéfinition par les sous-classes. C'est ce qui est fait d'ailleurs pour les Enum. Chaque type enum créé hérite de la classe java.lang.Enum, peut redefinir "toString()" mais pas "name()" qui pourtant donne la même valeur pour la classe mère. Bon, je m'éloigne un peu peut-être ...

  6. #6
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Mais non, toute précision est la bienvenue !

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/09/2012, 18h37
  2. héritage d'une classe abstraite
    Par new_wave dans le forum Langage
    Réponses: 8
    Dernier message: 04/03/2010, 13h54
  3. [Conception] Héritage sur Plusieurs classes abstraites
    Par facilus68 dans le forum Langage
    Réponses: 9
    Dernier message: 20/03/2009, 14h06
  4. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 11h37
  5. Erreur du designer avec héritage d'une classe abstraite
    Par Xzander dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2007, 01h36

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