Forum Clubic

[Java/UML] Héritage : méthodes abstraites

Salut…

Voici mon petit problème.

Dans un jeu, un utilisateur doit choisir son niveau. Le niveau peut être défini ou personnalisé.

J’ai donc une classe “Jeu”, une classe mère “Niveau”, et 2 classes filles “NiveauDefini” et “NiveauPerso”.

Les 2 classes filles n’ont pas les mêmes méthodes.

Dans les attributs de la classe “Jeu” j’ai déclaré un objte de type “Niveau” (étant donné que je ne connais pas à l’avance si il sera défini ou personnalisé).

Pour pouvoir ensuite utiliser les méthodes de l’une ou l’autre des classes filles, j’ai dû les mettre en “abstract” dans la classe mère “Niveau”.

Ca compile, ça marche… mais Eclipse n’est pas content car les méthodes abstraites propres à “NiveauDéfini” ne sont pas définies dans “NiveauPerso” et inversement.

Bref, la question est Doit-on obligatoirement définies toutes les méthodes abstraites de la classe mère dans toutes les classes filles ?

Je précise que si je ne les déclare pas en abstract dans la classe mère je ne peux pas les utiliser car j’ai déclaré un “Niveau” et ces méthodes n’existent pas pour niveau mais pour “NiveauDéfini” ou “NiveauPerso”.

Je crois que ce que j’ai fait n’est pas très propre, d’autant plus que c’est un projet d’UML et ça va pas faire terrible, mais je ne vois pas d’autres solutions :??:

Quelques petites précisions :

[cpp]//CLASSE JEU
public final class Jeu
{
private Niveau SonNiveau;

// (...)

SonNiveau=new NiveauDefini();
toto=SonNiveau.methodeDefini();
// OU
SonNiveau=new NiveauPerso();
toto=SonNiveau.methodePerso();

}

//CLASSE “Mère” NIVEAU
public abstract class Niveau
{
public abstract int methodePerso();
public abstract int medhodeDefini();
}

//CLASSE “Fille” NIVEAUPERSO
public final class NiveauPerso extends Niveau
{
public final int methodePerso(){ /* (…) */ }
}

//CLASSE “Fille” NIVEAUDEFINI
public final class NiveauDefini extends Niveau
{
public final int methodeDefini(){ /* (…) */ }
}[/cpp]

J’aurais aimé ne pas avoir à définir les méthodes en abstract dans la classe mère… mais est-ce possible :??:

Ah j’ai trouvé [:odipar_aliuqet] !

Il suffit de faire ça :

[cpp]private Niveau SonNiveau;

// (…)

SonNiveau=new NiveauDefini();
toto=((NiveauDefini)SonNiveau).methodeDefini();
// OU
SonNiveau=new NiveauPerso();
toto=((NiveauPerso)SonNiveau).methodePerso();[/cpp]