Software Design/Require the least powerful abstract class you need to implement a function

Related

 * Extract generic components