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