In order to maintain binary backwards compatibility in .NET, you generally can't add new abstract methods to public classes and interfaces. If you do, then code built against the old version of the assembly that extends/implements your class/interface will fail at runtime because it fails to fully extend/implement the new version. For classes, however, there is a handy workaround:
public abstract class Foo {
internal Foo() { }
}
Because Foo's constructor is internal, no-one outside of my assembly can extend Foo. Thus, I can add new abstract methods to Foo without worrying about backward compatibility since I know that no class in another assembly can extend Foo.
My question is, is there a similar trick for interfaces? Can I create a public interface and somehow guarantee that no one outside of my assembly will be able to create an implementation of it?
No, you can't.
But since in IL an interface is essentially just a pure abstract class (i.e. one without any implementation at all), you can use the technique you've already described and it will be practically the same.
As noted, keep in mind that this approach does restrict your type to inheriting just the fake "abstract class" interface. It can implement other interfaces, but won't be able to inherit any other type. This may or may not be a problem, depending on the scenario.
If it makes you feel better about the design, name your pure abstract class following the .NET convention for interfaces. E.g.
IFoo
instead ofFoo
.Of course, it does imply the question: why do you want to do this? If you have no implementation at all, what harm could come from allowing other code to implement your interface?
But from a practical point of view, it's possible to enforce your rules the way you want.