Common Type System—Private Interface Inheritance
Private Interface Inheritance
Historically, languages have permitted private inheritance. In C++, you can inherit from a type without being polymorphically compatible with that type. It’s just a convenient way to reuse an implementation. In the CTS, you cannot do private implementation inheritance. But you can use private interface inheritance.
Private interface inheritance is really just a way to hide methods from a type’s public API. They are compiled into private methods but are actually accessible through a type’s interface map. In other words, they can only be called through a reference typed as the interface on which the method is defined. An example will make this easier to understand:
class PrivateImplementer : IFoo { void IFoo.Foo() { Console.WriteLine("PrivateImplementer::IFoo.Foo"); } }
In this case, PrivateImplementer is publicly known to implement IFoo. Thus, an instance can be
treated polymorphically as an instance of IFoo. But you cannot actually call Foo on it unless you do
treat it as an IFoo. This code demonstrates this:
PrivateImplementer p = new PrivateImplementer(); p.Foo(); // This line will fail to compile IFoo f = p; f.Foo();
You can select individual methods of an interface to implement privately. For instance, if
PrivateImplementer implemented IFooBar, it might choose to implement Foo privately, but Bar
publicly using the ordinary syntax.
In practice, there aren’t many common cases where you would use private implementation. The
System.Collections.Generic library uses this approach to secretly implement all of the legacy
System.Collections weakly typed interfaces. This makes backwards compatibility "just work," for
example passing an instance of List<T> to a method that expects an IList will work just fine. In this
specific example, cluttering the new type APIs would have been a pity (there are quite a few methods
necessary for the weakly typed interoperability).
|

