The main reason to use interfaces is explained in the dependency inversion principle ( the D in SOLID ). - High-level modules should not depend on low-level modules. Both should depend on abstractions. - Abstractions should not depend on details. Details should depend on abstractions. The goal of this is decoupling the higher level from specific implementations, allowing for more maintainability. **Maintainability's main issue is compensate the unability of human beings to foresee the future.** Statements like *"ClientA only uses ImplementerA and ClientB only use ImplementerB"* has proven to not hold true forever.