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.