Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.
The basic technique for implementing dependency inversion using interfaces is called PROGRAMMING TO INTERFACES, and it’s always a good way to protect yourself (and your classes) from change. I’ve actually seen it described as “a fundamental principle of OOP”. It’s a good practice, but I personally doubt it’s fundamental, not in the way that, say encapsulation is.
The thing to be careful of with programming to interfaces is a cluttered class hierarchy. You should beware of any interface that is only implemented by one or two concrete classes. It’s probably just added complexity (otherwise known as “noise”).