"High-level classes should not call the low-level classes directly in order to avoid concretion. Instead, both should depend upon abstractions."
Then, in turn, abstractions should not depend upon the details or implementation. Instead, the implementation should be dependent on the abstraction.