A nice table:
Do | Don't |
1. Focus on interfaces. | 2. Be worried about the implementation. |
3. Mention semantic contract using interfaces. | 4. Let subtypes break this semantic contract of their parent types. |
5. Service decoupling using interfaces. | 6. Be coupled with specific concrete implementation. |
7. Family extension using interfaces. | 8. Break the family relationship using concrete implementation. |
9. Establish a family rule by abstract classes. | 10. Impose your own rule through concrete classes. |
11. Let interfaces answer all "what" about the system. | 12. Forget to mention "how" are you answering all "what" from interfaces. |