Program to the interface not the implementation
From CSSEMediaWiki
This idea says that objects should depend on the abstractions of a class instead of its concrete implementations. This reduces coupling from implementations, and increases flexibility. It means that clients are unaware of the specific types of objects they use, it only matters that the objects adhere to the abstract interface. If you wish to add another concrete subclass to the abstract class, the rest of the code will not be affected. The client can be given any implementation of the abstract class that it depends on and be able to use it.
This is closely related to the Dependency inversion principle.