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.