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();}
}
BlindDeafManas base class. Not very elegant in this example. Another (ugly) approach would be to throw UnsupportedOperationException in BlindMan.see (as certain iterators do for the remove operation). The last (and probably best) option would be to have anEyesclass referred to by a Man. You can then doman.setEyes(new BlindEyes()).Rectangle-Squareinheritance conundrum.Rectangle-Square? Apparently I meant circle-ellipse problem.