The Scenario:
While doing an API for a project, a colleague of mine ask me about the difference between implicitly and explicitly implementing an interface in C#. In all of the code (in our API), I did an explicit implementation of the interface with the sole purpose for the developers to use the API to code through interface. By doing this, it would promote a loosely coupled implementation between the client code and the API. Here is an example that I used to help me explain the benefit of doing this.
The Interface:
interface ISample { void invokeMe(string data); }
Implicit implementation of the interface:
public class ImplicitClass : ISample { #region ISample Members public void invokeMe(string data) { Console.WriteLine(data); } #endregion }
Explicit implementation of the interface:
public class ExplicitClass : ISample { #region ISample Members void ISample.invokeMe(string data) { Console.WriteLine(data); } #endregion }
The Client Code:
static void Main(string[] args) { // using Implicit implementation ISample isam; isam = new ImplicitClass(); isam.invokeMe("Hello implicit world by Interface!"); // using Explicit implementation ISample isam1; isam1 = new ExplicitClass(); isam1.invokeMe("Hello explicit world by Interface!"); // using the concrete class on an implicitly implemented class ImplicitClass imp = new ImplicitClass(); imp.invokeMe("Hello world by the implicit concrete class!"); // using the concrete class on an explicitly implemented class ExplicitClass exp = new ExplicitClass(); // This code here would not even compile, // the class could not access the implemented method. exp.invokeMe("Hello world by the explicit concrete class!"); Console.ReadLine(); }
Summary:
Using implicit implemetation could not force any client code to implement a program-by-interface because as you could see, implemented method can be invoked directly in the concrete class. By using explicit implmentation the client code must program-by-interface (access through interface) to invoke the method.
You might be asking why to program-by-interface? Well, the answer is to promote a loosely coupled implementation. This technique allow server developers to enforce separation of the interface from the implementation.