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 :

POO & Java : Attribut abstrait


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Par défaut POO & Java : Attribut abstrait
    Bonjour à tous et merci d'avance pour le temps que vous passez à me lire et répondre.

    Ma question est la suivante : Est-il possible de déclarer un attribut abstrait ?
    Je m'explique :

    Voici une classe abstraite papa ( syntaxe incorrecte au niveau de " l'abstract", c'est justement pour mettre en évidence ce que je voudrais faire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public abstract class Papa {
     
       private abstract String name;
     
       public getName(){
           return this.name;
       }
     
    }
    Et son fils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Fils extends Papa {
        private String name;
     
        public Fils(String name){
            this.name = name;
        }
    }
    Le résultat voulu est le suivant : lors de l'appel de la méthode getName sur un objet de type Papa récupérer la valeur du name de la classe Fils.

    Autrement dit, est-il possible de déclarer un attribut abstrait ?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Non, et ça n'a aucun intérêt. "abstract" oblige à redéfinir la méthode dans une classe fille.
    Dans ton exemple, c'est "getName" qui doit être "abstract".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Par défaut
    La possibilité d'avoir un attribut abstrait n'a pas "aucun interet". C'est d'ailleur possible dans des language tel que SmalTalk d'où ma question pour Java.

    Quel est l'interet ?
    Imaginons les classes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class MaClasse1 extends MaClasseAbstraite{
         private final String nom = "Livre1";
         private final String auteur = "Auteur1";
    }
     
    public class MaClasse2  extends MaClasseAbstraite{
        private final String nom = "Livre2";
        private final String auteur = "Auteur2";
    }
     
    etc..
    Il est important de comprendre que les attributs nom et auteur sont "hardcodé". ( Pas beaucoup d'interet pour un livre/auteur mais c'est pour laisser l'exemple simple. Dans mon cas, ce sont des informations du type "Version de la classe" , "Service auquel la classe appartient" , ... )


    Maintenant je voudrais implémenter des getter sur nom et auteur mais je n'ai pas envie de devoir écrire les deux méthodes dans chacunes de mes classes ( il y'en a un bon paquet en réalité ).

    Je vais donc déclarer ces méthodes dans ma classe abstraite... Mais celà ne change pas mon problème, je vais devoir implémenter dans chaque classe un code identique ce qui est loin d'être top pour la maintenance.

    Avec un attribut abstrait , j'aurai pu définir "nom" et "auteur" comme attribut abstrait de MaClasseAbstraite. Dés lors lorsque j'appellerai la méthode "getNom()" de ma ClasseAbstraite celle-ci irait récupérer "l'implémentation de l'attribut abstrait" ( c'est à dire sa valeur dans la classe fille ) me permettant de n'avoir qu'une seule version du code pour l'ensemble des classes, d'ou l'utilité d'un attribut abstrait.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    J'ai déjà essayé de faire ce genre de chose (déclarer dans une classe abstraite un champ final destiné à être instancié différemment selon les classes dérivées), malheureusement tous les champs finaux doivent être instanciés dans la classe même. On aurait pu imaginer que l'instanciation des champs ne soit obligatoire que dans les classes instanciables...

    La solution pour laquelle j'ai finalement opté :
    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
    19
    20
    21
    22
    public abstract class Papa {
       private abstract String name;
       protected Papa(String name) {
          this.name = name;
       }
       public getName(){
           return this.name;
       }
    }
     
    public Fils1 extends Papa {
        public Fils1(String name) {
            super(name);
        }
    }
     
    public Fils2 extends Papa {
        private static final String NAME = "nom";
        public Fils2() {
            super(NAME);
        }
    }
    Ça oblige à définir des constructeurs à rallonge pour la classe abstraite si plusieurs champs sont concernés...

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il parait que les EDI sont la solution miracle pour faire tout seul les getter et setter

    Perso lorsque j'ai des attributs que je peux marquer final je les passe en public, ce qui m'évite de me farcir les getter et setter, me fichant des conventions sur la question, et je me fais gronder à chaque fois que je le dis, mais pour l'instant j'en suis très content.

    Autres solutions :
    • utiliser un langage de script tel que groovy pour cette partie là
    • inverser le problème : utiliser une interface avec tous les getter et setter, gérer cette classe par le biais d'un Proxy, et mettre tous les attributs dans une hashmap, cela évite d'écrire tous les attributs.
    • lorsqu'il y a des objets avec un grand nombre d'attributs, c'est qu'il y a souvent une base de données dans le circuit ; en ce cas des outils comme Hibernate aident beaucoup.

Discussions similaires

  1. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 19h01
  2. [POO] Interface et méthode abstraite en PHP5
    Par Invité dans le forum Langage
    Réponses: 9
    Dernier message: 24/04/2006, 00h54
  3. [POO] retourner les attributs d'une classe
    Par ozzmax dans le forum Langage
    Réponses: 10
    Dernier message: 12/01/2006, 00h10
  4. [POO] Objet en attribut d'un objet
    Par Tchinkatchuk dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 10h00
  5. [POO] Heritage d'attribut statique surchargé !
    Par Jaxofun dans le forum Langage
    Réponses: 25
    Dernier message: 16/08/2005, 09h01

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