Same as with interfaces, an abstract class is a contract in which you have provided some general (or abstract) functionality that is applicable to many scenarios, but expect an implementer to provide some functionality that is specific and/or different for each scenario. Someone mentioned the Stream
example - very good example.