Je pense que vous devriez utiliser la composition plutôt que l'héritage dans ce cas, ou avoir plusieurs sous-classes qui composent l'humain.
Bien que je comprenne votre logique, une BaseClass est un contrat, qui garantit que toutes les classes de ce type doivent adhérer à ce comportement, avoir une sous-classe qui supprime la méthode parent est un grand NON NON .
Bien que vous puissiez lancer diverses exceptions, je ne m'engagerais pas du tout dans cette voie. Pensez-y de cette façon, disons que je suis un développeur qui a seulement besoin d'accéder à l'objet humain, je m'attends à un certain comportement, et tout d'un coup j'appelle une méthode d'interface et j'obtiens une exception juste parce que je l'ai appelée ? Vous ne devriez pas être au courant des implémentations des classes dérivées et quand vous pouvez ou ne pouvez pas les appeler.
Voici quelques solutions :
Faire de l'humain une composition de BasicHumanFunctions, VisionSystem, etc. Alors l'aveugle n'aurait que quelques-unes de ces fonctions.
class Human {
private BasicHumanFunctions _basicFunctions; //contains breathe funcitonality.
private VisionSystem _vision; //contains see
}
class BlindMan {
private BasicHumanFunctions _basicFunctions;
}
Faites en sorte que la classe de base Human ne contienne que le même comportement que tous les humains, comme la respiration, etc., puis créez un HealthyHuman et un BlindHuman, etc. Vous pouvez ensuite utiliser HealthHuman et le sous-classer davantage si nécessaire.
class Human {
void breathe() {};
// other Human basic functions;
}
class HealthyHuman extends Human {
void see() {};
//other healthy human functions
}
class BlindHuman extends Human {
void useCane() {};
}
Dans le second cas, vous pouvez également utiliser la composition pour partager le comportement :
class BlindHuman extends Human {
private VoiceSubsystem _voice = new VoiceSybsystem();
void speaker() { _voice.speaker();}
}