The Car interface is broken
Defining a Car interface is probably the most tired example in object-oriented development. Virtually every OO book, article or class uses an Car analogy to explain what an interface is.
"Imagine if instead of learning how to drive a car and then being able to drive any car, we had to learn how to drive each instance of every car we get into. It would be really inefficient if after learning how to drive the Ford Pinto we had to start all over again in order to figure out the Mustang. A much more efficient way is to deal with the cars interface: the steering wheel, turn signals, gas pedal and brake. This way, no matter what is implemented on the backend of the interface, we don't really care because in the end it subscribes to the basic car contract and that is how we will deal with it (through the interface)."
- Matthew Cochram - C# Interface Based Development
So, the interface defines the contract exposed to the driver, but the driver is only one of the personas that will be interacting with a Car instance. I was reminded of this last week when the public ICar interface threw a CarStartupException when I turned the key. In plain English; the damn thing wouldn't start. I drive a Volvo XC90, which is more like an overclocked computer on wheels than the T-Ford like car in your everyday "How to fix you car" self-help book.
Since I only know how to play the Driver and Passenger roles, I called a road assistance company to help get the car started. When the mechanic opened the hood on the car, the IEngine interface. This interface had very few public member, there were some lids one could open to refill various fluids and a fuse box. The engine itself was hidden under yet another lid. In a sense, we can say that the Car did not expose its Engine interface, but just an Engine facade.
Even if the Mechanic should be better suited than me to operate the Engine interface, there was little he could do, so the car had to be towed to the dealer. The mechanics at the dealership had all sorts of widgets to help fix my car, they were particularly fond of their debugger which was a laptop they connected to yet another interface on my car.
In most introductory OO classes, you first define the ICar interface and then you implement a Car class. A lesson the be learned from this story is that you really don't need to build it yourself to use it and that interfaces exists many levels of abstraction.
I Bob can program against a service I've written through the public service interface. Inside the serve I might use one of the classes form the System.Security.Cryptography namespace even if I have no idea of how the crypto-wizardry works. If the MD5CryptoServiceProvider should stop encrypting, I'm pretty sure there are some mechanics on the BCL team who can help me out.