Why would you really need to know what kind of a database you use beside of course deciding during instantination? This is the beauty of abstraction that you can have :). You could force the class to return some form of an identification, like a string using the interface if you need it. And yes, you can add different methods to a class that implements an interface, but you just wouldn't be able to access it directly without casting. But then again, if you need many different public methods for different databases (which shouldn't really happen) then this level of abstraction might not help you.