Use interface when you don't need to provide ANY implementation.
Use abstract class when you need to provide SOME implementation, but leave the rest unimplementated.
The way I picture it is that interface just gives you most basic direction what your class should do. Abstract class implementats those directions, but doesn't do it fully - just becomes a "half-done" class (and there are situations when you'd need that).
* Use abtract classes for fundamentals concepts in your OO design. Implement abstract classes with basic and and common services of a class hierarchy.
* Use Interface as "requirements class" for a process. Interfaces enable to describe what you will find at least in a class. For example, when a method need and Interface X instance to run, you don't care about what class instance you actually use, you only care about the fact that the instance you use meet the minimum requirements described in the interface X.
The soul is dyed the color of its thoughts. Think only on those things that are in line with your principles and can bear the light of day. The content of your character is your choice. Day by day, what you do is who you become. Your integrity is your destiny - it is the light that guides your way. - Heraclitus