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 :

usage du mot clé super et accès aux variables privées


Sujet :

Langage Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 981
    Points : 138
    Points
    138
    Par défaut usage du mot clé super et accès aux variables privées
    Bonjour,

    J'ai crée une classe CompteBancaire qui possède la variable privée solde et J'ai crée sa classe fille CompteBancaireAvecDecouvert qui a accès au constructeur de la classe mère CompteBancaire et qui par ce biais initilaise la variable privée solde.

    Dans la classe CompteBancaire, j'ai défini la méthode retrait,qui diminue le montant du solde du montant du retrait, mais dans la classe fille je veux la redéfinir pour expliquer la notion de redéfinition d'une méthode.

    Cependant, du fait que la variable "solde" est privée, je ne peux pas accéder à cette variable depuis la classe fille CompteBancaireAvecDecouvert, pour modifier sa valeur via la méthode retrait redéfinie.

    Comment puis je faire pour corriger cela ?

    Par ailleurs,je voulais avoir la cionfirmation que l'on ne peut pas trouver l'expression super.super en java.

    Je vous remercie beaucoup de votre aide.

    Cordialement.

    Nathalie

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Citation Envoyé par harbonne Voir le message
    Comment puis je faire pour corriger cela ?
    Il te suffit de créer des accesseurs dans ta classe CompteBancaire. Ceux-ci ne doivent pas être publics (puisque de l'extérieur, on ne doit pas modifier le solde) mais protégés : cela permet ainsi à ta classe fille de les utiliser et ainsi de modifier la valeur du solde.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    a ma connaissance, pas de super.super en java. Super permet d'accéder à des données de la classe mère que ta classe courante redéfinrais. Accéder à la grand mère briserais la principe d'encapsulation.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Dans la mesure où tu veux modifier la propriété depuis une classe fille, la logique voudrait que la propriété soit directement définie comme "protected".
    Du coup, plus besoin des getter/setter... et ta méthode redéfinie peut modifier sa valeur.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 981
    Points : 138
    Points
    138
    Par défaut accès à des variables privées
    Je vous remercie de vos réponses qui toutes conviennent.

    J'ai choisi d'expérimenter celle proposée par CyberChouan , c'est à dire de déclarer la vairalbe solde variable privée et de créer un accesseur protected.

    Il y a cependant ce bug que j'aimerais arranger

    Pour cela ,je vous montre le code des deux classes comptebancaire et comptebancaireavecdecouvert

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
    public class CompteBancaire{
     
    	private String nomProprietaire ; 
     
    	private char[]numero_compte ;
     
    	private double solde ; 
    	//protected double solde;
     
    	public CompteBancaire(){} // fin de premier constructeur
     
    	public CompteBancaire(String proprio, char[]num, double montant){
     
    		this.nomProprietaire=proprio ; 
     
    		this. numero_compte = num ;
     
    		this.solde= montant ;
     
    	}// fin de deuxième constructeur
     
    //Création d’un getter pour récupérer le contenu de la variable privée solde
     
    	protected double getSoldeCourant(){
     
    		return this.solde ;
    	}
    // création d'une méthode depot pour ajouter un montant au solde courant
    	public void depot(double montant){
    	this.solde += montant; 
     
    	}
     
    // création d'une méthode pour enregistrer un retrait d'argent, 
    //c'est à dire une diminution du solde courant,à condition que ce solde le permette 
    	public void retrait(double montant) throws ProvisionInsuffisanteErreur{
     
    		System.out.println("appel du retrait sur compte simple ");
    		if (this.solde < montant){ throw new ProvisionInsuffisanteErreur() ;
    		}// fin de if 
     
    		else {this.solde-=montant;}
     
    	}// fin de méthode retrait
     
    	public void virement(CompteBancaire cb, double montant)throws ProvisionInsuffisanteErreur {
     
    		cb.retrait(montant);
    		this.depot(montant);
     
    	}// fin de méthode virement
     
    }// fin de classe CompteBancaire

    a présent la classe comptebancaireavecdecouvert

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    public class CompteBancaireAvecDecouvert extends CompteBancaire{
    	
    	private double decouvertMax; 
    	
    	
    	// création du constructeur de la classe CompteBancaireavecDecouvert
    
    	public CompteBancaireAvecDecouvert(String proprio, char[]num, double montant, double decouvertMaximum){
    		
    		super(proprio, num, montant);// l'opérateur super mermet d'accéder depuis la classe fille aux 
    		//attributs et méthodes non privées de la classe mère
    		
    		this.decouvertMax=decouvertMaximum;
    		
    	}// fin du constructeur de la classe CompteBancaireAvecDecouvert
    	
    	// création d'un setter pour modifier le montant du decouvert maximum du compte courant
    	
    	public void setDecouvertMaximal(double montant){
    		
    		this.decouvertMax= montant;
    	}
    	
    		
    	public void retrait (double montant) throws ProvisionInsuffisanteErreur{
    		
    		System.out.println(" appel du retrait sur compte avec decouvert ") ;
    		if (this.getSoldeCourant() + this.decouvertMax< montant){
    			throw new ProvisionInsuffisanteErreur() ;
    		}// fin de if 
    		
    		else {
    			this.getSoldeCourant()-=montant;//j'ai ici un message d'erreur qui me dit ceci "the left hand side of an assignement must be a variable-ce que je comprends bien mais comment arranger cela si ce n'est en declarant la variable solde protected
    		}
    		
    		
    		
    	}// fin de méthode retrait
    	
    }// fin de classe CompteBancaireAvecDecouvert
    Meci beaucoup à vous de votre aide.
    Par ailleurs, pouvez vous me dire quelle est la différence entre les classes int et Integer, de même qu'entre les classes boolean et Boolean et entre les classes Character et char.

    Je vous remercie beaucoup de votre aide.

    Cordialement.

    Nathalie

  6. #6
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    solution n° 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     // dans super classe
     protected final void retraitControlé(double montant) {
       // tout ce qu'on veut en plus pour enregitrer 
       this.solde -= montant ;
     }
    chaque méthode retrait(montant) doit appeler cette méthode protected ...

    solutino N° 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public final void retrait(double montant) {
      if( methodeControleRetrait(montant) ){
          this.solde -= montant ;
      } else // etc. etc.
    on a ici un hook de controle (mais j'aime moins car l'exception doit être gérée
    de manière plus compliqué pour expliquer le refus)

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu ne peux pas faire ce genre de traitement via le getter, il faut passer par un setter.
    Tu pourrais envisager ceci de rajouter un setter setSoldeCourant(double)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setSoldeCourant(getSoldeCourant() - montant);
    ou plus simplement de modifier la signature de retrait comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void retrait(double montant, boolean negatifAuthorise) throws ProvisionInsuffisanteErreur
    {
     
        if (this.solde < montant && !negatifAuthorise)
        { 
            throw new ProvisionInsuffisanteErreur();
        }    
        else {this.solde-=montant;}
     
    }

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par harbonne Voir le message
    Par ailleurs, pouvez vous me dire quelle est la différence entre les classes int et Integer, de même qu'entre les classes boolean et Boolean et entre les classes Character et char.

    Je vous remercie beaucoup de votre aide.

    Cordialement.

    Nathalie
    Integer et la classe Wrapper (enveloppe) du type primitif int tout comme les autres que t'a cité. Integer est une classe mais à partir de java 5 grâce au boxing et unboxing on peut confondre les 2 types.
    Pour ton problème d'héritage je te conseille de mettre tes attributs notamment solde en protected puisque ta classe mère est utilisé comme une base pour l'autre.
    A++

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par harbonne Voir le message
    Par ailleurs, pouvez vous me dire quelle est la différence entre les classes int et Integer, de même qu'entre les classes boolean et Boolean et entre les classes Character et char.
    La différence c'est que int et boolean ne sont pas des classes, ils ne dérivent pas de Object, n'ont pas de méthode toString() ne peuvent pas être dérivés, ne peuvent pas être mis dans des List, Vector ...
    Il faut penser aux types int et bool comme en C++.
    Un Integer est une classe qui contient un int ...

    Par contre depuis Java 1.5, l'autoboxing permet de transformer des int en Integer et vice-versa automatiquement sans code...

    JB

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut
    Et Integer est une classe que l'on ne peut étendre, dont la valeur stocké ne peut être modifié, comme dans un "final int".

Discussions similaires

  1. [FLASH MX] Accès aux variables
    Par renofx1 dans le forum Flash
    Réponses: 4
    Dernier message: 21/12/2005, 16h30
  2. Acces aux variables d'une DLL
    Par abignon dans le forum MFC
    Réponses: 1
    Dernier message: 08/09/2005, 15h29
  3. [C#] Accès aux variables Session
    Par kalan dans le forum ASP.NET
    Réponses: 9
    Dernier message: 31/08/2005, 17h40
  4. [FLASH MX2004] [AS2] Accès aux variables d'une classe
    Par stailer dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 17/07/2005, 13h58
  5. [Language]Accès aux variables
    Par Adaemon dans le forum Langage
    Réponses: 12
    Dernier message: 27/04/2005, 15h17

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