Assume that I have a library which defines an interface:
namespace LibraryOne
{
public interface ISomething
{
void DoSomething();
}
}
I implement this in a second library
namespace LibraryTwo
{
public class Something : ISomething
{
public void DoSomething() { throw new Exception("I don't know how to do anything!"); }
}
}
I then use this class in a third library
namespace LibraryThree
{
public class MyClass
{
private Something myThing = new Something();
public void DoIt() {
myThing.DoSomething();
}
}
}
Visual Studio tells me that LibraryThree
has to have a reference to LibraryOne
for this code to work. Even if I make ISomething
internal
and make LibraryOne
InternalsVisibleTo
LibraryTwo
, I still have to have that reference. Why?
If I actually referred to an ISomething
, I'd understand. If I expected Something
to behave like an ISomething
, I'd understand. But I just need to treat it as a Something
.
I just need to treat it as a
Something
That's the thing: the moment you implement ISomething
in Something
, it becomes an ISomething
too. The fact that a class implements an interface is integral to that classes nature.
Without this, you would be able to inherit Something
to create SomethingElse
, and that SomethingElse
would not implement ISomething
. Now consider this example:
public class Something : ISomething
{
public void DoSomething() { ... }
// Add this method
public void ProcessSomething(Something other) {
ISomething byInterface = other; // This is legal
// Now do something with byInterface
}
}
Your hypothetical code does this:
public class SomethingElse : Something {
...
}
Now pass an instance of SomethingElse
to ProcessSomething
to complete the circle: your SomethingElse
is a Something
but it is not ISomething
, breaking the cast that C# expect to work unconditionally.
When the CLR executes your application, it loads all the information about the types referenced in your program.
Because Something
implements ISomething
, the CLR needs to know about the interface - so the .dll containing this interface has to be accessible to the executable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With