Abstract classes can provide implementations for their methods whereas an Interface strictly provides a contract (what methods an object must implement).
Abstract classes are useful in situations where you want to provide a base implementation to inheritors but you don't want an instance of your class created directly. For example, think about a car. You wouldn't want to create a generic car, but each care can share some base set of functionality:
public abstract class Car
{
public InternalCombustionEngine Engine { get; private set; }
public virtual void Start()
{
Engine.Start();
}
public abstract void Drive();
}
Interfaces are useful when you have some classes that may not be directly related to each other, but you want to treat in the same fashion because each has a similar set of functionality.