I've been racking my brains over inheritance for a while now, but am still not completely able to get around it.
For example, the other day I was thinking about relating an Infallible Human and a Fallible Human. Let's first define the two:
- Infallible Human: A human that can never make a mistake. Its do_task() method will never throw an exception
- Fallible Human: A human that will occasionally make a mistakes. Its do_task() method may occasionally throw a ErrorProcessingRequest Exception
The question was: IS an infallible human A fallible human OR IS a fallible human AN infallible human?
The very nice answer I received was in the form of a question (I love these since it gives me rules to answer future questions I may have).
"Can you pass an infallible human where a fallible human is expected OR can you pass a fallible human where an infallible human is expected?"
It seems apparent that you can pass an infallible human where a fallible human is expected, but not the other way around. I guess that answered my question.
However, it still feels funny saying "An infallible human is a fallible human". Does anyone else feel queasy when they say it? It almost feels as if speaking out inheritance trees is like reading out statements from propositional calculus in plain English (the if/then implication connectives don't mean the same as that in spoken English). Does anyone else feel the same?