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 :

classe / heritage / classe abstraite


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut classe / heritage / classe abstraite
    Bonjour

    Je suis confronté à une envie forte de programmer "mieux" en java.
    + dans l'esprit POO que je ne le faisais avant.

    Voici mon dilemne :
    J'ai créé une classe (pour le moment, public) que j'ai appelé FicheCD, une autre FicheDVD, une autre FicheVYNIL etc ... autant de classes que de type de produit.
    Pas tres POO tout ca, vous me direz! C'est justement pourquoi je viens ici

    Toutes mes fiches ont des methodes et des attributs communs (mais certaines sont specifiques à la FicheCD, d'autres a FicheDVD etc..). La question que je me pose est :
    Dois je :
    1. Creer une classe mere Fiche avec toutes les methodes et attributs communs à mes fiches, pour ensuite, créer une "FicheCD extends Fiche", "FicheDVD extends Fiche" et integrer les attributs et methodes specifiques ?

    2. Creer une classe abstraite (mere) Fiche qui regroupe TOUTES les methodes (communes et non communes) dans laquelle je ne definirais pas les methodes specifiques a chacune de mes fiches ?

    3. Autre solution ?

    Sachant que, dans mon main, je remplis une liste de FicheCD, une liste de fiche DVD etc .. (là encore, y'a t il un moyen de remplir juste une liste de Fiche (classe mere) et d'en recuperer que les particularites de chaque fiche (CD,DVD,VYNIL ..) quand j'en ai besoin ?

    Merci pour votre aide.

  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
    1. ok. C'est la bonne façon de faire en POO

    2. surtout pas! et d'ailleurs le compilateur te le refuserait. Une classe non abstraite qui étend une classe abstraite doit implémenter toutes les méthodes abstraites de sa classe mère
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Points : 200
    Points
    200
    Par défaut
    Salut,

    Je suis d'accord, sur le fait que la méthode 1 est correcte mais peut être inutile si il n'instancie jamais d'objet de type Fiche.

    Ne devrait il pas créer une classe abstraite de type Fiche (même si il n'a pas de méthodes abstraites) et dériver celle-ci pour les classes FicheDVD, FicheCD...

    Ainsi il ne pourra instancier de type FICHE !!!

    @+

  4. #4
    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 vain_mich
    Je suis d'accord, sur le fait que la méthode 1 est correcte mais peut être inutile si il n'instancie jamais d'objet de type Fiche.
    Je ne suis pas d'accord. Même si on n'instancie jamais d'objets de type Fiche, cette classe permet de regrouper tout ce qui est commun aux différents types de fiches.

    Et par rapport à une interface, une classe permet d'implémenter les méthodes qui sont communes à toutes les fiches ("classer()", etc.)

    Et cela permet ensuite à d'autres d'effectuer des traitements sur des "Fiche", sans avoir à se préoccuper du type réel de la fiche.

    Enfin, si jamais la classe "Fiche" ne doit jamais être instanciée directement, rien n'empêche de la déclarer abstraite même si elle ne contient aucune méthode abstraite
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    En effet, je n'instancierai jamais d'objet de type Fiche (cas de la mathode 1) mais utiliserai plutot les FicheCD, FicheDVD etc ... en fonction des listes que je desire visualiser.

    Seulement, lorsque je vais creer ma liste de fiche, je serai alors obligé de connaitre le type de fiche. Donc, pour chaque liste de fiches, je devrais créer une liste comme :
    List<FicheCD> malisteCD=new ListArray();
    List<FicheDVD> malisteDVD=new ListArray();

    Là, se pose un probleme :
    lorsque j'aurais à passer ma liste en argument d'une autre classe (classe Visualisation par exemple), il faudra alors que je créer autant de classe Visualisation que de type de visualisation ??
    A.
    VisualisationCD(List<FicheCD> malisteCD)
    {...}
    VisualisationDVD(List<FicheDVD> malisteDVD)
    {...}

    ou dans une meme classe Visualisation, faire :
    B.
    (mais je crois ne pas pouvoir avoir plusieurs constructeurs Visualisation(List maliste) dans ma classe nan ?!)
    Visualisation(List<FicheCD> malisteCD)
    Visualisation(List<FicheDVD> malisteDVD) ...

    C.
    ou encore, creer une classe Visualisation mere (comme methode 1 plus haut) ?

    Quelle est la methode la plus POO pour cela ?

    NB :
    Enfin, si jamais la classe "Fiche" ne doit jamais être instanciée directement, rien n'empêche de la déclarer abstraite même si elle ne contient aucune méthode abstraite
    --> a quoi ca sert de declarer la classe abstraite alors ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Points : 200
    Points
    200
    Par défaut
    Tu as FicheCD qui derive de AbstractFiche :


    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 void main() {		
     
    		List<AbstractFiche> fiches = new ArrayList();
     
    		FicheCD ficheCD1 = new FicheCD();
    		FicheCD ficheCD2 = new FicheCD();
     
    		fiches.add(ficheCD1);
    		fiches.add(ficheCD2);
     
    		visualiser(fiches);
    	}
     
    	public void visualiser(List<AbstractFiche> fiches){
    		System.out.println("");
    	}
     
    }
    Tu n'as qu'une seule méthode visualisé qui a en argument une liste de fiches qui peuvent être CD,DVD...

    L'interêt de déclarer la classe abstraite evite d'instancier celle-ci !!!!

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    Ok, merci pour ces infos !

    Petite question idiote :
    Peut on, dans une classe abstraite, definir des constructeurs comme dans une classe normale ?

  8. #8
    Membre régulier Avatar de sylviadesbois
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 108
    Points
    108
    Par défaut
    Petite question idiote :
    Peut on, dans une classe abstraite, definir des constructeurs comme dans une classe normale ?
    il n'y a pas de question idiote.

    Et oui tu peux definir des constructeurs dans une classe abstraite.

  9. #9
    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
    Pour préciser un peu la réponse précédente, on peut effectivement créer un/des constructeurs pour une classe abstraite.

    Cependant, ils ne permettront pas d'instancier cette dernière (une classe absraite ne peut pas être instanciée directement). Ces constructeurs pourront seulement être utilisés de manière indirecte par les constructeurs des classes filles de cette classe abstraite. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Test extends UneClassAbstraite {
       public Test() {
          super(); // invocation du constructeur de la classe abstraite
       }
    }
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par pepito31
    Seulement, lorsque je vais creer ma liste de fiche, je serai alors obligé de connaitre le type de fiche. Donc, pour chaque liste de fiches, je devrais créer une liste comme :
    List<FicheCD> malisteCD=new ListArray();
    List<FicheDVD> malisteDVD=new ListArray();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<Fiche> list = new ArrayList<Fiche>();
    list.add(new FicheCD());
    list.add(new FicheDVD());
    (c'est le polymorphisme)

    Citation Envoyé par CyberChouan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super(); // invocation du constructeur de la classe abstraite
    Un appel à super() sans paramètres ne sert jamais à rien (c'est toujours fait implicitement).

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    Merci a tous pour vos reponses !

    Mais là, je susi un peu perdu a vrai dire ... (je vais essayer d'etre clair)

    J'ai créé ma Fiche abstraite de laquelle je descends une FicheCD, une FicheDVD et de laquelle je pourrais descendre d'autres types de fiches...

    A partir d'un fichier XML, je lis les infos et en fonction d'une balise qui me signale le type de fiche, je créé une nouvelle instance de ma fiche (FicheCD ou FicheDVD) et je remplis une liste de FicheCD et FicheDVD comme ci-dessous:

    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
     
    static List<FicheCD> MaListeFicheCD=new ArrayList<FicheCD>();
    static List<FicheDVD> MaListeFicheDVD=new ArrayList<FicheDVD>();
    //etc ..
    //boucle sur le fichier XML : 
    int inGen=0, inCD=0, inDVD=0; // indices pour les listes de fiches
     
    while (i.hasNext()) {
    Element MonElement = (Element)i.next();
    	FicheXML MaFiche=new FicheXML(MonElement);
    	// Alimentation de la liste des fiches
    	MaListeFiche.add(inGen,MaFiche);
     
     
    	if (MaFiche.getType().compareToIgnoreCase("CD")==0){
    		FicheCD MaFicheCD=new FicheCD(MaFiche);
    		MaListeFicheCD.add(inCD,MaFicheCD);
    		inCD++;
    	} else if (MaFiche.getType().compareToIgnoreCase("DVD")==0){
    		FicheDVD MaFicheDVD=new FicheDVD(MaFiche);
    		MaListeFicheDVD.add(inDVD,MaFicheDVD);
    		inDVD++;
    	} else {
    		// Cas avec d'autres types
    	}
    		inGen++;
    }
    Deja, je me demande si c'est tres POO d'ecrire cela comme ca !?

    Ensuite, en fonction du choix de l'operateur (qui decide de visualiser tous les CD ou tous les DVD) - variable MonChoixTYPE, je créé un instance d'une classe Visionneuse (une pour les CD, VisionneuseCD et une autre pour les DVD, VisionneuseDVD) - Et là, je suis certain que c'est pas la bonne manière de faire puisque cette visionneuse a une structure commune, c'est juste que je fais appel à certains parametres (non communs aux CD et DVD) dans l'une ou l'autre des Visionneuse... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void showVisionneuse(){
    		MainWINDOW MaFen=new MainWINDOW(MaListeDeType);
    		MonChoixTYPE=MaFen.getmaliste();
    		if (MonChoixTYPE.compareToIgnoreCase("CD")==0) {
    		  		 new VisionneuseCD(MaListeFicheCD);
    		}	     
    		else if (MonChoixTYPE.compareToIgnoreCase("JDVD")==0){
    				 new VisionneuseDVD(MaListeFicheDVD);
    		} else {System.out.println("TYPE INCONNU in  ShowVisionneuse "); }
    }
    Comment puis je proceder ??
    Peut etre il preferable que je créé une classe Visionneuse générique qui prend la liste de TOUTES mes fiches MaListeFiche, et que je fasse le tri dans cette classe entre les CD, les DVD etc ... mais là encore, ma visionneuse fait appel à une autre classe pour faire apparaitre une fiche spécifique (donc,passage de la FicheCD ou FicheDVD en argument) ?!
    En gros, je sais pas quelle est la bonne methode pour que ca soit clair et que, le jour ou d'autres types vont intervenir, ca soit simple de modification ..

    Je ne sais pas si j'ai ete super clair ... en tout cas, si je ne l'ai pas ete, demandez le moi.
    Et merci par avance pour votre oeil avisé !!

  12. #12
    Membre régulier Avatar de sylviadesbois
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 108
    Points
    108
    Par défaut
    j'avoue que je ne te comprends pas trop
    pourquoi tu ne crée pas une classe VisioneuseGenerique, je ne vois pas le problème...
    tu peux développer un peu stp...

  13. #13
    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
    Oui,
    Une Visionneuse abstraite et une VisionneuseFactory (avec une methode comme getFactory () )pour instancier proprement VisionneuseCD et VisionneuseDVD.
    peut être une classe génerique aussi pour les CD et DVD. Une méthode pour recuperer la liste de disque dans la visionneuse ne serait pas mal.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    Ok, tres bien.... je m'y pencherai apres mes vacances !!
    Merci a tous encore une fois


Discussions similaires

  1. heritage class en c++
    Par gusgus dans le forum C++
    Réponses: 12
    Dernier message: 07/05/2008, 17h55
  2. class heritage surcharge
    Par blackadder dans le forum C++
    Réponses: 5
    Dernier message: 16/06/2006, 16h24
  3. [Diag de classes] heritage à travers paquetages ?
    Par Invité dans le forum Diagrammes de Classes
    Réponses: 8
    Dernier message: 25/05/2005, 08h15
  4. Heritage de classe avec classes internes
    Par Regis.C dans le forum Langage
    Réponses: 11
    Dernier message: 27/04/2005, 12h19
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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