What is the difference between an interface and an abstract class, and when would you use one over the other?