C'est normal que cela ne fonctionne pas et cela ne fonctionnera jamais : tu casses les règles de la POO
En implémentant l'interface ITest tu dois respecter son contrat, ce qui n'est pas le cas ici puisque la méthode valider(A) a disparu (tu ne peux pas passer un objet de type A à la méthode valider(B)).
En modifiant le type d'un des paramètres d'une méthode, tu sors du cadre de la redéfinition/implémentation : ce n'est plus la même méthode (lire la FAQ : Quelles sont les règles à respecter pour redéfinir/implémenter une méthode ?).
En effet comme tu implémentes ITest tu peut donc faire ceci :
puis avec une éventuelle classe C étendant A tu dois pouvoir faire ceci :
test.valider(new C()); // appelle valider(A)
Or tu n'as pas implémenté la méthode valider(A) !
Si tu veux une méthode dont le type des paramètres varient, il faut utiliser les Generics :
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 28 29
| /**
* @param <T> Le type utilisé pour le paramétrage de l'interface (A ou une classe fille)
*/
interface ITest<T extends A> {
public void valider(T t);
}
/**
* On implémente ITest en conservant le même paramétrage :
*/
class A1<T extends A> extends A implements ITest<T> {
public void valider(T t) {}
}
/**
* On implémente ITest en spécilisant le paramétrage
* (les classes filles devront également utilisé B)
*/
class A2 extends A implements ITest<A2> {
public void valider(A2 b) {}
}
/**
* On implémente ITest en spécialisant le paramétrage sur une classe fille :
*/
class A3<T extends A2> extends A implements ITest<T> {
public void valider(T t) {}
} |
a++
Partager