(a) If different TreeNode implementations were required, for example
for binary trees versus ternary trees, then TreeNode should be an
abstract class.

(b) If only a fixed number of different walk orders were specified to
be supported by TreeWalker, then TreeWalker could just be a concrete
class, and the order could be specified as an integer argument to its
constructor, chosen from a set of named constants.

(c) If all objects that support drawing themselves require some common
initialization code to interact with the graphics environment,
Drawable should be an abstract class with this necessary code so that
all Drawables are guaranteed to be initialized correctly.

(d) If it is really important for implementations of Application to be
able to extend arbitrary superclasses, then Application should just be
an interface.
