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 :

Partager du code entre plusieurs classes-filles


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut Partager du code entre plusieurs classes-filles
    Bonjour à tous,

    Tout est ds le titre. À titre d'exemple, je voudrais implémenter un jeu rudimentaire de combat naval.

    Les types de bateaux diffèrent par leur longueur (porte-avion:5, Cuirassé:4, etc.). Je pensais donc créer une classe Boat comprenant les méthodes communes à tous les types (toString, isSunk (coulé), etc.)

    Voici le schéma simplifié de la classe Boat, avec juste un constructeur et la méthode toString:

    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
    import java.util.*;
    public class Boat {
      private int length;
      private String type = "Boat";
      Collection<Cell> boatCells = new ArrayList();
     
      // le constructeur requiert une longueur, les 2 1ers paramètres sont les
      // coordonnées du début du bateau, EW est l'orientation du bateau sur la
      // grille
      Boat (char c, int n, boolean EW, int length) {
        for (int i=0; i < length; i++) {
          Cell C = new Cell();
          // ...
          boatCells.add(C);
        }
      }
      public String toString() {
        String s = new String(type + " ");
        Iterator<Cell> e = boatCells.iterator();
        while(e.hasNext()) {
          Cell C = e.next();
          s += C.c + ":" + C.n + " ";
        }
        return s;
      }
    }
    Voici le schéma d'une classe fille BattleShip

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class BattleShip extends Boat {
      public int length = 4; 
      String type = "BattleShip";
     
      // le constructeur ne requiert pas de longueur mais appelle
      // le constructeur de la classe mère avec une longueur fixe
      BattleShip (char c, int n, boolean EW) {
        super(c,n,EW, 4);
      }
    }
    Si je fais le test suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class test {
      public static void main (String[] argv) {
        BattleShip a1 = new BattleShip('A',0,true);
        System.out.println(a1);
      }
    }
    J'obtiens

    Boat A:0 B:0 C:0 D:0

    soit bien l'affichage des 4 cellules, mais le type est celui de la classe mère.

    Je ne trouve pas de solution à la situation suivante: comment spécifier des caractères propres aux classes filles (comme ici la longueur et le type) tout en appelant une ou des méthodes implémentées dans leur classe-mère, de manière à ne pas devoir ré-écrire le code à chaque fois au sein des classes filles.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    "String type" est deja dans la classe mere, pourquoi le redefinir dans la classe fille ?
    Tu as juste a faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.type = "BattleShip";

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par LeTsIrGoD Voir le message
    "String type" est deja dans la classe mere, pourquoi le redefinir dans la classe fille ?
    [/code]
    Parce que les méthodes font appel à ces champs, et que ce sont elles qui différencient les classes-filles entre elles:

    * si la méthode est implémentée ds la classe mère, le champs doit y être déclaré aussi.
    * si la méthode doit être ré-implémentée dans chaque classe-fille, c'est ennuyeux, et je ne vois plus à quoi sert la classe-mère.

    Citation Envoyé par LeTsIrGoD Voir le message
    Tu as juste a faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.type = "BattleShip";
    ? Ceci ne compile pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class BattleShip extends Boat {
      this.length = 4; 
      this.type = "BattleShip";
     
      BattleShip (char c, int n, boolean EW) {
        super(c,n,EW, 4);
      }
    }
    Cela non plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class BattleShip extends Boat {
      this.length = 4; 
      this.type = "BattleShip";
     }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ton champ doit être protégé, pas private. En private, BattleShip a deux champs "type", un champ BattleShip.type et un champ Boat.type. Le code du parent ne voit que Boat.type et le code du fils que Battleship.type.

Discussions similaires

  1. [Débutant] Partager une même propriété entre plusieurs classes
    Par BasicZX81 dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/09/2012, 15h56
  2. Partager une variable entre plusieurs classes
    Par jasonpolakow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/01/2011, 10h02
  3. objet partagé entre plusieurs classes
    Par grinder59 dans le forum C#
    Réponses: 16
    Dernier message: 13/05/2010, 16h07
  4. Partage de code par plusieurs instances
    Par a.tintin dans le forum MFC
    Réponses: 3
    Dernier message: 08/08/2005, 14h03
  5. partager un schema entre plusieurs utilisateurs
    Par jrman dans le forum Oracle
    Réponses: 5
    Dernier message: 15/12/2004, 16h53

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