abstract base class example