There are many uses for an abstract class. An abstract class is one that cannot have any direct instances.
In software design, it is one way to describe an interface. Some of the declared operations can be implemented in the superclass. Any remaining implementations must be specified in sub-classes. Regardless of where the implementations exist, an abstract class means there can be no direct instances, only instances of some non-abstract subclass.
In a domain analysis, an abstract class is a way of modeling an abstraction. For example, think of the abstraction Role
. It is useful to say that a Person
plays a number of Roles
. However, there is no instance of a Role
that makes sense, without it also being a more specific kind of Role
, such as Employee
, Fireman
, or Teacher
. For this situation, you not only want Role
to be abstract, you also want a covering axiom. For more on that, please read https://stackoverflow.com/a/35950236/2596664.