The single responsibility principal states that a class should only have a single responsibility.
Classes should be open for extension and closed to modification ...
Liskov substitution principle ... you should be able to use a parent class whererever a child class is being used.
The interface segragation principal states interfaces should be small and not force implementation classes to implement methods that they do not need.
The dependency inversion principal states our code should depend on interfaces and not on concrete implementations