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 :

Pb de conception et héritage ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut Pb de conception et héritage ?
    Bonjour,

    je vous expose mon PB :

    J'ai une classe MERE avec des méthodes.

    Je voudrais plusieurs classes filles héritant de cette classe MERE mais que certaines classe fille lors de leur instanciation aient accès au méthode de la classe MERE et d'autres non.

    EX :

    //classe mere
    public class Property extends AbstractObject{
    public void setData(BData toto){

    //classe fille
    public class TimeProperty extends Property{

    TimeProperty instanceClasseFille=new TimeProperty();
    //et ce que je ne veux pas pouvoir faire, c'est :
    instanceClasseFille.setData(new BData());
    autre contrainte :

    je veux pas que la methode soit private parcequ'elle est utilisée par
    d'autres classes filles de cette classe mere.....

    Comment faire ?
    Merci d'avance

  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,

    Il faut que tu limites la visibilité de la méthode setData() à protected dans la classe Mère, pour l'augmenter dans les classes filles qui en ont besoin, par exemple :
    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
    //classe mere
    public class Property extends AbstractObject{
    	protected void setData(BData toto){
    		...
    	}
    }
     
     
     
    // classe fille
    public class PropertyFille extends Property {
    	// on authorise setData() pour cette classe :
    	public void setData(BData toto){
    		super.setData(toto);
    	}
    }
     
     
    // classe fille
    public class PropertyFille extends Property {
    	// on authorise pas le setData() pour cette classe,
    	// donc on ne redéfinit pas setData()
    }
    a++

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Pourquoi est ce que tu ne fais pas plusieurs heritages ?

    Je m'explique :

    A est ta classe mere principale, avec notamment une methode a

    B est une classe fille, qui doit avoir accès à a.
    C est une classe fille qui ne doit pas avoir accès à a

    si B et C héritent de A, c'est pas possible tel quel, sans réécrire tes methodes...

    Ce que tu peux faire, c'est une classe A', qui hérite de A

    A est la classe mere principale, et ne contient pas a.
    A' hérite de A et implémente a

    B hérite de A'
    C hérite de A directement

    Du coup, B et C héritent de A (par transitivité pour B), B dispose de a, et C ne dispose pas de a

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Je retire ce que j'ai dit, la solution de adiGuba est probablement vachement plus pro et plus clean...

  5. #5
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut
    adiGuba, le mot clé PROTECTED ne m'empeche pas de voir la methode, en fait ma methode déclarée PROTECTED dans la classe mère est visible des classes filles, donc ça va pas le faire.

    Par contre je suis d'accord avec le raisonnement de ghorgor, mais est la seule manière de faire ? Est ce propre ? Ne peut on pas jouer avec d'autres propriétés des classes ( abstract, etc...)

    Merci d'avance

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Sinon, tu as une autre manière, moins clean, c'est de réécrire les méthodes en question dans les classes ou tu ne veux pas qu'elles soient accessibles, et de lever une erreur...

    Elles sont visibles, mais inutilisables...

    Si c'est défini en abstract, c'est pas implémenté au niveau de la classe mère, donc tu devras lés réécrire à chaque fois, dans chaque classe fille, et tu ne pourras pas instancier un objet de la classe mere, si jamais tu as besoin...

  7. #7
    NGY
    NGY est déconnecté
    Membre expérimenté
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Par défaut
    Comme l'a dit ghorgor une solution (sale) pourrait être de redéfinir la méthode interdite dans la classe fille de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setData(BData bdData) {
      throw new UnsupportedOperationException("Méthode interdite pour la classe " + this.getClass().getName());
    }
    Mais bon, l'erreur ne sera détectée qu'à l'exécution (c'est en partie pour ça que c'est pas très joli). Il faudra donc bien documenter cette spécificité dans la JavaDoc.
    En fait c'est utile si tu as de nombreuses sous-classes et que seules quelques-unes ne doivent pas implémenter setData().

    Par contre, pourquoi tu dis que le protected ne te vas pas ?
    Effectivement, la méthode sera visible dans toutes les classes filles, mais les appels à la méthode setData() par d'autres classes seront bien impossibles.

  8. #8
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut
    Au final il me faudrait 2 types de classes fille :

    Certaines où j'aurais le setData et d'autres non, donc le PROTECTED est la seule solution ?

  9. #9
    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
    Citation Envoyé par elitost
    adiGuba, le mot clé PROTECTED ne m'empeche pas de voir la methode, en fait ma methode déclarée PROTECTED dans la classe mère est visible des classes filles, donc ça va pas le faire.
    Mais tu ne peux pas utiliser la méthode sur un de ces objets depuis une autre classe...
    Maintenant si la classe fille ne doit pas du tout avoir accès à la méthode, c'est qu'elle ne devrait pas hérité de la classe mère...

    Citation Envoyé par ghorgor
    Je retire ce que j'ai dit, la solution de adiGuba est probablement vachement plus pro et plus clean...
    Heu... En fait moi je preferre la tienne

    Citation Envoyé par elitost
    Par contre je suis d'accord avec le raisonnement de ghorgor, mais est la seule manière de faire ? Est ce propre ? Ne peut on pas jouer avec d'autres propriétés des classes ( abstract, etc...)
    En effet c'est preferable car tu n'a qu' définir la méthode setData() une seule fois, et tu n'as pas besoin de la surcharger dans les classes filles...

    Je ne vois pas en quoi ce ne serait pas propre (il s'agit simplement d'héritage).
    Par contre il faut voir si cela convient bien à ta conception : En quoi consiste ces objets ? Pourquoi cette méthode ne doit pas être partagé par toutes les filles ?

    Sinon je ne pense pas qu'il y ait d'autre moyen de faire cela (abstract t'oblige à implémenter la méthode...).

    Enfin comme le précise NGY, la solution de l'Exception pose problème car l'erreur ne se detecte qu'à l'exécution et non pas à la compilation...

    Citation Envoyé par elitost
    Certaines où j'aurais le setData et d'autres non, donc le PROTECTED est la seule solution ?
    Non la solution de ghorgor peut faire l'affaire.
    Grosso-modo si j'ai bien compris tu veux deux types de "Property", donc
    • Une classe Property avec toutes les méthodes de bases (sauf setData()). Dans ce cas la valeur de data sera initialisé par le constructeur par exemple.
      Une classe EditablePropertyqui étends Property pour lui rajouter setData().
    Ensuite chacune de tes classes héritent de l'une ou l'autre selon le cas...


    Maintenant tu peux quand même définir la méthode setData() en protected dans la classe Property pour authoriser les classes filles à modifier la valeur de data dans leurs méthodes...

    a++

  10. #10
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut
    Ok, j'ai le fonctionnement que je veux, effectivement en ayant 2 classes mères différentes.

    Je vous remercie bien de vos aides.

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

Discussions similaires

  1. [Composite] [Java] problème de conception, multi héritage, composite ?
    Par phoenix_stealer dans le forum Design Patterns
    Réponses: 2
    Dernier message: 13/11/2013, 17h47
  2. Problème de conception avec héritage
    Par oodini dans le forum C++
    Réponses: 3
    Dernier message: 24/01/2013, 11h43
  3. conception POO (héritage) : une galerie d'image
    Par greg91 dans le forum Langage
    Réponses: 4
    Dernier message: 06/10/2011, 21h16
  4. [MCD] Conception et héritage
    Par Invité dans le forum Schéma
    Réponses: 20
    Dernier message: 22/06/2010, 09h55
  5. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03

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