I almost agree with you completely. Just one side note, as long as we use inheritance, one can never really be sure what the runtime class might do. Like my VersionedCounter for example