In a nutshell, this is how the DIP works.
The definition for the DIP is this:
High level objects should not depend on low-level implementations.
In the same way that the Coca-Cola CEO shouldn't double as a truck driver, high-level code shouldn't perform low-level duties.