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 :

extends Vector : Empcher l'appel a des méthodes "méres"


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut extends Vector : Empcher l'appel a des méthodes "méres"
    Bonjour,

    J'ai créé une classe qui hérite de la classe Vector dans laquelle j'ai redéfinit les méthodes add() et remove().

    Voilà son 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public class VectorCouchesSupplementaires extends Vector<Layer>{
    	/**
             * 
             */
    	private static final long serialVersionUID = 4526120306651519039L;
     
    	public VectorCouchesSupplementaires(){
    	}
     
    	public boolean remove(Layer layer){
    		super.remove(layer);
    		//Mise à jour du tableau des couches supplémentaires
    		JTablePerso.updateTableaux();
     
    		//Mise à jour de la table couches supplémentaires
    		Execution.UpdateVisibiliteCouche(false,layer.getName().trim(),LayerName.siret,LayerName.mlsm);
    		return true;
    	}
     
    	public boolean add(Layer layer){
    		super.add(layer);
    		//Mise à jour du tableu des couches supplémentaires
    		JTablePerso.updateTableaux();
     
    		//Mise à jour de la table couches supplémentaires
    		Execution.UpdateVisibiliteCouche(true,layer.getName().trim(),LayerName.siret,LayerName.mlsm);
    		return true;
    	}
    }
    Ma question est assez simple, comment empêcher que dans une classe autre, il soit possible d'appeler la méthode monVecteurPerso.remove(parametre) avec un paramètre qui ne soit pas du type Layer? Cette interdiction fonctionne très bien avec la méthode add(), mais pour remove(), si le paramètre n'est pas de type Layer, c'est la méthode remove() de la classe Vector qui est appelée...

    Merci beaucoup.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            @override
    	public boolean remove(Object o){
                    if (!o instanceof Layer)
                        throw new IllegalArgumentException("can only remove layers");
                    Layer layer = (Layer)o;
    		super.remove(layer);
    		//Mise à jour du tableau des couches supplémentaires
    		JTablePerso.updateTableaux();
     
    		//Mise à jour de la table couches supplémentaires
    		Execution.UpdateVisibiliteCouche(false,layer.getName().trim(),LayerName.siret,LayerName.mlsm);
    		return true;
    	}

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            @override
    	public boolean remove(Object o){
                    if (!o instanceof Layer)
                        throw new IllegalArgumentException("can only remove layers");
                    Layer layer = (Layer)o;
    		super.remove(layer);
    		//Mise à jour du tableau des couches supplémentaires
    		JTablePerso.updateTableaux();
     
    		//Mise à jour de la table couches supplémentaires
    		Execution.UpdateVisibiliteCouche(false,layer.getName().trim(),LayerName.siret,LayerName.mlsm);
    		return true;
    	}
    Merci pour ton aide tchize_, mais en fait cela ne correspond pas exactement à ce je que je souhaiterais. En fait je voudrais rendre impossible la compilation s'il existe quelque part dans l'appli, la méthode monVecteurPerso.remove(object) avec object qui n'est pas de type Layer.
    Je suis assez clair dans mes explication ?

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Il n'est pas possible de réduire la visibilité d'une méthode héritée d'une classe mère ; donc la méthode de Tchize est la seule viable.

    Par contre tu peux la passer en Deprecated, et avoir en plus un remove qui prend en argument un Layer, ce qui fournira une information aux gens qui l'utiliseraient sur un Objet qu'il vaut mieux passer par la méthode qui prend en argument un Layer, tout en gardant la fonctionnalité.

    Edit : et ça permet via les warnings de savoir où ça peut être utilisé dans l'appli.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    ces méthodes ne permettront de toutes facons pas de détecter ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    VectorCouchesSupplementaires vect = ...;
    Vector v = vect;
    v.remove(objet)
    Au moins la surcharge avec un IllegalArgumentException permet de détecter l'erreur at runtime.

    Note que vouloir désactiver une méthode du parent est généralement dangereux car, au final, tu ne respecte plus le contrat du parent. Dans ton cas, il vaudrait peut etre mieux avoir remove(object) qui traite spécialement le cas des layer et délèhue juste au parent els autres cas.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public final void methodePlusSupportee () {
      throw new UnsupportedOperationException();
    }
    À la compilation, tu ne peux le faire, mais dans le code, c'est ce qu'il y a de plus propre (avec la doc adéquate, bien sur).

    En clair:
    * ajouter le keyword final
    * lancer une UnsupportedOperationException();

Discussions similaires

  1. optimiser l appel a des méthodes virtuelles
    Par Frifron dans le forum C++
    Réponses: 2
    Dernier message: 20/07/2009, 08h37
  2. Réponses: 5
    Dernier message: 05/09/2007, 17h23
  3. Réponses: 12
    Dernier message: 19/08/2007, 20h26
  4. appelé une autre méthode problem des érreurs
    Par aefmaaradji84 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 28/07/2007, 23h29
  5. appel des méthodes init,start?
    Par schwarzy2 dans le forum JBuilder
    Réponses: 7
    Dernier message: 13/06/2007, 09h59

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