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

avec Java Discussion :

Abstraction et factorisation de méthodes privées


Sujet :

avec Java

  1. #1
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut Abstraction et factorisation de méthodes privées
    Bonjour

    Je me remet a java après 4-5 ans sans y toucher et c'est un peu dur de se remettre dans le bain. PHP m'a pas aidé a garder un bon niveau...

    J'ai 3 classes dans mon exemple.
    Une classe Cible abstraite
    Une classe CibleCirculaire
    Une classe FenetreDeJeu (qui contient mes cibles)

    la classe Cible contient une méthode tirer(x, y) qui appelle la méthode contient(x, y) qui vérifie si on est dans la cible, et si oui, qui appelle la méthode choc.
    Les méthodes contient et choc sont abstraites car elles dépendent de la forme géométrique de mes cibles.

    J'ai donc écrit ca :
    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
     
    public abstract class Cible {
    	private int positionX;
    	private int positionY;
     
    	public Cible(int x, int y){
    		this.positionX = x;
    		this.positionY = y;
    	}
     
    	protected abstract boolean contient(int x, int y);
     
    	protected abstract void choc();
     
    	public void tirer(int x, int y){
    		if(contient(x,y)){
    			choc();
    		}
    	}
    	public int getX(){
    		return positionX;
    	}
    	public int getY(){
    		return positionY;
    	}
    }
    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
     
    public class CibleCirculaire extends Cible {
    	private int rayon;
    	public CibleCirculaire(int x, int y, int rayon) {
    		super(x, y);
    		this.rayon = rayon;
    		// TODO Auto-generated constructor stub
    	}
    	public int getRayon(){
    		return rayon;
    	}
    	public void setRayon(int r){
    		this.rayon = r;
    	}
    	public boolean contient(int x, int y){
    		boolean aRetourner = false;
    		int xCible = getX();
    		int yCible = getY();
    		int distance = (x-xCible)*(x-xCible)+(y-yCible)*(y-yCible);
    		if(distance<=rayon){
    			aRetourner = true;
    		}
    		return aRetourner;
    	}
    	protected void choc(){
    		setRayon(getRayon()-1);
    	}
    }
    Et un petit lanceur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Lanceur {
    	public static void main(String[] args) {
    		FenetreDeJeu f = new FenetreDeJeu(500, 600);
    		CibleCirculaire c1 = new CibleCirculaire(100, 200, 10);
    		f.ajouterCible(c1);
    		c1.choc();
    		c1.choc();
    		c1.choc();
    		System.out.println(c1.getRayon());
    	}
    }
    Le problème est que je voudrais ne pas autoriser l'appel à la méthode choc depuis l'extérieur de ma classe. J'aimerais donc mettre la méthode choc en private.
    Java ne veut pas mettre une méthode abstraite privée, comment puis je faire pour avoir à la fois la factorisation de la méthode tirer, et l'accès réduit à choc ?

    Pierre

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les méthodes protected ne sont accessible que depuis les classes filles ou les classes du même package.

    Donc en séparant tes classes en packages tu ne pourras plus utiliser ces méthodes depuis la classe Lanceur...

    a++

  3. #3
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Merci

    D'après toi, je n'ai donc aucune manière de dire que la classe choc ne peut être appelée que par CibleCirculaire ?

    L'étendre au package ne pose pas de problème dans le cas présent, mais dans une application plus complexe, je pense que je vais retrouver ce genre de situation avec l'envie de factoriser certaine méthodes, et le besoin de sécuriser l'accès à certaines méthodes.

  4. #4
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Voila le comportement final que je désire :
    (j'ai retiré la notion de classe abstraite de façon a voir le bon comportement)
    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 CibleCirculaire {
    	private int positionX;
    	private int positionY;
    	private int rayon;
    	public CibleCirculaire(int x, int y, int rayon) {
    		this.positionX = x;
    		this.positionY = y;
    		this.rayon = rayon;
    		// TODO Auto-generated constructor stub
    	}
    	public int getRayon(){
    		return rayon;
    	}
    	public void setRayon(int r){
    		this.rayon = r;
    	}
    	public boolean contient(int x, int y){
    		boolean aRetourner = false;
    		int xCible = getX();
    		int yCible = getY();
    		int distance = (x-xCible)*(x-xCible)+(y-yCible)*(y-yCible);
    		if(distance<=rayon){
    			aRetourner = true;
    		}
    		return aRetourner;
    	}
    	private void choc(){
    		setRayon(getRayon()-1);
    	}
    	public void tirer(int x, int y){
    		if(contient(x,y)){
    			choc();
    		}
    	}
    	public int getX(){
    		return positionX;
    	}
    	public int getY(){
    		return positionY;
    	}
    }
    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
     
    import java.util.*;
    public class FenetreDeJeu {
    	private int largeur;
    	private int hauteur;
    	List<CibleCirculaire> listeCible = new ArrayList<CibleCirculaire>();
    	public FenetreDeJeu(int largeur, int hauteur){
    		this.largeur = largeur;
    		this.hauteur = hauteur;
    	}
    	public int getHauteur(){
    		return hauteur;
    	}
    	public int getLargeur(){
    		return largeur;
    	}
    	public void ajouterCible(CibleCirculaire c){
    		listeCible.add(c);
    	}
    }
    Avec une erreur sur les ligne c1.choc dans mon lanceur qui me dit que je ne peut accéder à cette méthode.

    Le problème, c'est que je suis un gros fainéant et que recopier a l'identique la méthode tirer, ça va pas m'amuser longtemps.

    Est ce que vous avez une idée pour résoudre ça ?

  5. #5
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Bon, après une petite réflexion sur ce que je voulais faire, je me suis dit que ca ne devais pas être très propre de mettre en private une méthode dans une classe abstraite, vuq eu toutes ces filles pourraient utiliser cette méthode dans ce cas la.

    Normal donc que ca soit interdit.

    J'ai donc retiré de ma classe abstraite les méthodes choc et contient et j'ai transféré la méthode tirer dans toutes les classes filles.

    Au final, ca me donne bien le résultat escompté.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/03/2007, 20h25
  2. Réponses: 4
    Dernier message: 17/03/2007, 01h06
  3. setTimeout avec une méthode privée
    Par Erakis dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 29/06/2006, 10h47
  4. Méthodes privées: pratique courant en Python
    Par Thierry Chappuis dans le forum Général Python
    Réponses: 3
    Dernier message: 25/11/2005, 19h30
  5. Réponses: 8
    Dernier message: 04/06/2004, 09h13

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