在依赖注入方面,显式实现接口有什么好处吗?
据我所知,接口可以显式或隐式实现:
interface IFoo
{
void Bar();
}
//implicit implementation
class Foo1 : IFoo
{
public void Bar(){}
}
//explicit implementation
class Foo2 : IFoo
{
void IFoo.Bar(){}
}
现在,显式实现只能通过调用接口方法来调用,而隐式实现可以直接在类的实例上调用:
class Baz
{
void Ba()
{
Foo1 foo1 = new Foo1();
foo1.Bar();
Foo2 foo2 = new Foo2();
foo2.Bar(); //syntax error
IFoo foo2_explicit = new Foo2();
foo2_explicit.Bar();
}
}
因此,使用显式接口实现,不能意外地在具体类上调用方法,而必须调用接口方法。这是否可以防止紧密耦合的代码,就像 DI 的一个目的一样,或者我在这里搞错了吗?毕竟,不能意外编写一个构造函数或方法,将一个具体类注入而不是一个接口:
class Baz
{
void Ba(Foo2 foo)
{
foo.Bar(); //syntax error
}
void Bb(IFoo foo)
{
foo.Bar();
}
}