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.