En java, quelle est la bonne façon de concevoir une sous-classe qui réduit la fonctionnalité de la super-classe ?
Il s'agit en fait de savoir comment l'héritage peut réduire la fonctionnalité. Un exemple de ceci en Java auquel je peux penser est la fonction Collections#unmodifyableList qui dit :
Renvoie une vue non modifiable de la liste spécifiée. Cette méthode permet aux modules de fournir aux utilisateurs un accès en "lecture seule" aux listes internes. Les opérations d'interrogation sur la liste renvoyée "lisent à travers" la liste spécifiée, et les tentatives de modification de la liste renvoyée, que ce soit directement ou par l'intermédiaire de son itérateur, entraînent un message d'erreur UnsupportedOperationException .
C'est donc ce que je ferais si je voulais supprimer une certaine fonctionnalité. Cependant, assurez-vous que l'utilisation de cette fonctionnalité est claire, par exemple, indiquez dans la Javadoc de BlindMan
que see()
entraînera une exception.
Toutefois, si vous souhaitez "réduire" plusieurs fonctionnalités, peut-être de manière indépendante, et les modifier au fil du temps, je préférerais utiliser des variables plutôt que l'héritage. En fin de compte, vous n'étendez pas la superclasse, alors pourquoi abuser de l'héritage pour cela ? Ce que vous avez, c'est un humain avec différents propriétés .
Le comportement des méthodes doit être documenté. Je pourrais penser à la classe suivante pour votre cas d'utilisation :
public class Human {
private boolean seeing;
public void setSeeing(boolean seeing) { ...}
public boolean isSeeing() { ... }
/**
* Returns what the human sees at the moment, or null
* if he/she can't see (seeing is false).
*/
public String see() {
if(seeing){
return "I can see a tree!";
}else{
return null;
}
}
// same goes for hearing
}