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 :

Demande de précisions sur les niveau de visibilité


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Demande de précisions sur les niveau de visibilité
    Bon, avant tout, je vous dis bonjour à tous !

    Voila, il faut que je vous expose un petit souci que j'ai eu et pour ça rien de mieux qu'un peu de code :

    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
     
    public abstract class UneLettre {
        protected final String getLettre() {
            return "Lettre "+this.getClass().getName()+" - "+Integer.toHexString(hashCode());
        }
    }
     
    public class A extends UneLettre {
    }
     
    public class B extends UneLettre {
     
        public void test(A a) {
            System.out.println("Moi : "+this.getLettre());
            System.out.println("Lui : "+a.getLettre());
        }
     
    }
    Bon, voila. J'ai deux classes, A et B, qui heritent de UneLettre. La classe abstraite UneLettre apporte une methode protected qui affiche le nom de la classe de l'objet courant. La classe A ne fait rien, la classe B introduit une methode de test.

    Voila, ensuite je fais ce petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            A _a = new A();
            B _b = new B();
            System.out.println("test");
            _b.test(_a);
    Et voila ce que j'obtiens :
    test
    Moi : Lettre javaapplication1.test.B - 42e816
    Lui : Lettre javaapplication1.test.A - 9304b1
    Vous allez me dire : oui, et alors ?

    Alors la methode getLettre est protected ! B ne devrais pas pouvoir faire a.getLettre() !!
    Si j'ai bien tout suivi, le mot clé protected donne accès à une methode/variable de classe à tous les héritiers. ok ? Mais néanmoins B et A sont deux objets distincs...

    Donc :
    - Soit c'est un bug, mais j'ai testé le même code sous PHP et lui aussi est OK
    - Soit le mot clé protected donne accès à TOUS les heritiers d'une classe, même si ce sont des objets distincts... Si c'est le cas, les principes de sécurité introduits dans mes applications ne servent à rien...
    - J'ai fait une erreur que je n'ai pas vu

    Bon, jettez y un petit coup d'oeil et merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    protected donne accès à une methode/variable de classe à tous les héritiers
    ... et aux classes du même package.

    Nicolas

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Les spécifications du langage Java sont assez claires sur le sujet :

    Otherwise, if the member or constructor is declared protected, then access is permitted only when one of the following is true:
    - Access to the member or constructor occurs from within the package containing the class in which the protected member or constructor is declared.
    - Access is correct as described in §6.6.2.
    http://java.sun.com/docs/books/jls/t...mes.html#6.6.2

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut hum...
    Hum... ok ok ....

    Mais heu...

    Dans ce cas, toutes les classes de mon package peuvent y accèder, et moi je veux pas ça...

    Je voudrais que ma methode soit accèssible par les classes héritières uniquement ! Et pas de l'extérieur !

    Y'a un moyen ? un truc ? un bidule ?

    ps : j'ai de l'argent si il faut

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    dsl, il n'y a aucun moyen pour rendre un membre accessible aux sous-classes uniquement.

    Je t'envoie la facture par MP

  6. #6
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Points : 250
    Points
    250
    Par défaut
    juste comme ca ... tu n'as cas faire une classe abstraite et obliger les sosu classe a surcharger la methode et tu n'auras cas la changer en private ?


    je me trompe pt (assez fatiguer en ce moment)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par rbello Voir le message
    Dans ce cas, toutes les classes de mon package peuvent y accèder, et moi je veux pas ça...

    Je voudrais que ma methode soit accèssible par les classes héritières uniquement ! Et pas de l'extérieur !

    Y'a un moyen ? un truc ? un bidule ?

    ps : j'ai de l'argent si il faut
    S'il te faut absolument çà alors isole ta classe est ses héritières dans un package à part entière.
    C'est peut être idiot mais çà peut aider je crois.

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/07/2012, 10h00
  2. demande d'information sur les processus sql server
    Par patrick B dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/11/2005, 14h04
  3. Précisions sur les recordset DAO
    Par Igricheff dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2005, 17h16
  4. Précision sur les sauvegarde à chaud
    Par alxkid dans le forum Administration
    Réponses: 2
    Dernier message: 09/08/2004, 18h55
  5. [VBA-E]Demande de précision sur les menus
    Par geffdenimes dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2003, 10h46

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