(a) TreeNode should be a concrete class: one implementation for its
contract is sufficient, and it is not expected to be extended; it
could be final.

(b) TreeWalker should be an abstract class: all TreeWalkers are likely
to share some common implementation, such as initialization with a
given tree object, but is must be abstract because its exact behavior
is unspecified--a subclass must specify the order in which to walk the
tree.  Such a class for specifying the tree walking order is likely to
be a special purpose class written for just that task, so it is not a
problem that it must extend the TreeWalker class.

(c) Drawable should be an interface: a wide variety of objects,
extending from different superclasses, should be able to be drawn to
the graphics system.  Also, different classes of objects may have
vastly different ideas of how to "draw" themselves; there will be
little drawing implementation to be shared among Drawables, in the
general case (certain related implementations of Drawable will share
some drawing code from a common superclass).  All that is required of
Drawables is a method to tell the object to draw itself, given
some sort of graphics context to draw into.

(d) Application should be an abstract class: the behavior of the
particular application is undefined, but certain code will be shared
among all applications, e.g., to set up the application's main window
and draw its representation as an icon.
