  Programming languages serve a dual purpose: to communicate programs to
computers, and to communicate programs to humans. Indeed, it is this dual
purpose that makes programming language design a constrained and challenging
problem. Inheritance is an essential aspect of that second purpose: it is a
tool to improve communication. Humans understand new concepts most readily by
first looking at a number of concrete examples, and later abstracting over
those examples. The essence of inheritance is that it mirrors this process: it
provides a formal mechanism for moving from the concrete to the abstract.
