I know I need to save information in between times my application is executed.
I know roughly what methods I'll need to accomplish this. I also can provide several methods which perform various parts of the overall data storage operation.
I know my customers have different requirements for data storage, based on preferences (MS Sql, Oracle) and laws (health industry security requirements).
How can I provide an object that does 80% of the heavy lifting, but leaves the last 20% open for customization?
An abstract base class allows us to customize that last 20% for each customer yet reuse the 80% of common code in the base class. Also, abstract classes don't suffer from versioning issues that interfaces face, which is a bonus.
I can code my application, provide default implementations of the abstract base class, test it and deploy it without actually having to have a different version for each client. As clients request different storage methods, a different implementation can be supplied and used at runtime via dependency injection.