I think you should use Composition rather than inheritance in this case, or have various subclasses that make up the human.
While I do understand your logic, a BaseClass is a contract, that guarantees all classes of that type should adhere to this behavior, having a subclass that removes the parent method is a big NO NO..
While you could throw various exceptions, I wouldn't go down that path at all.
Think about it this way, say I am a developer who only needs to access Human object, I expect a certain behavior, and all of a sudden I call an interface method and get..an Exception just because I called it?? You should not be aware of the derived classes implementations and when you can or cano't call them.
Here are a few solutions:
Make Human a composition of BasicHumanFunctions, VisionSystem, etc. Then blind man would have only a few of those.
class Human {
private BasicHumanFunctions _basicFunctions; //contains breathe funcitonality.
private VisionSystem _vision; //contains see
}
class BlindMan {
private BasicHumanFunctions _basicFunctions;
}
Make Human base class contain only the same behaviour all humans would like breathing etc, and then create a HealthyHuman and a BlindHuman etc, each creating their own methods.
You can then use HealthHuman and subclass that further if you need.
class Human {
void breathe() {};
// other Human basic functions;
}
class HealthyHuman extends Human {
void see() {};
//other healthy human functions
}
class BlindHuman extends Human {
void useCane() {};
}
For the second case you can still use composition too to share behaviour:
class BlindHuman extends Human {
private VoiceSubsystem _voice = new VoiceSybsystem();
void speaker() { _voice.speaker();}
}