You never have to use either. When defining a group of similar classes you may find it beneficial to define an interface (or more than one) that specifies what things the classes have in common. If there is some common code that the classes should share, you may want to put that code in a base class. If that base class itself should not be instantiated, then you may want to mark it as abstract. In the long run, you probably should always define an interface whenever you define a base class.