I would use an abstract class when there is ...
- a shared state or implementation (common base of functionality)
- partial implementations (if some methods need a default implementation and needs to be abstract for subclasses to override)
- Hierarchical Relationships (is-a relationships)
Don't use an abstract class when...
- Multiple classes need to implement the same set of methods but are unrelated in their inheritance hierarchy.
- You need to define a pure contract without any shared state or implementation.
It really comes down to whether you need shared implementation (abstract class) or just behavioral specification (interface).