A class should have only one responsibility, only one reason to change.
A class should be open to extension but closed to modification (barring bug fixes).
Derived classes must be substitutable for their base classes. If your derived class has an empty or throw-only override method from the interface, there is something wrong with the interface.
Prefer many fine-grained interfaces for specific roles rather than a few monolithic interfaces.
Depend on interfaces/abstractions and not on concrete classes.