1Use an interface when you want to force developers working in your
2system (yourself included) to implement a set number of methods on the
3classes they'll be building.
4Use an abstract class when you want to force developers working in your
5system (yourself included) to implement a set numbers of methods and you
6want to provide some base methods that will help them develop their child
7classes.
8Another thing to keep in mind is client classes can only extend one abstract
9class, whereas they can implement multiple interfaces. So, if you're
10defining your behavior contracts in abstract classes, that means each child
11class may only conform to a single contract. Sometimes this a good thing,
12when you want to force your user-programmers along a particular path. Other
13times it would be bad. Imagine if PHP's Countable and Iterator interfaces
14were abstract classes instead of interfaces.
15One approach that's common when you're uncertain which way to go (as
16mentioned by cletus below) is to create an interface, and then have your
17abstract class implement that interface.
18