依存性注入に関して明示的にインターフェイスを実装する利点はありますか?
私が理解している限り、インターフェイスは明示的または暗黙的に実装できます。
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 の目的の 1 つである密結合コードを妨げますか、それともここで間違ったツリーを吠えていますか? 結局のところ、インターフェイスの代わりに注入された具象クラスを取得するコンストラクターまたはメソッドを誤って作成することはできません。
class Baz
{
void Ba(Foo2 foo)
{
foo.Bar(); //syntax error
}
void Bb(IFoo foo)
{
foo.Bar();
}
}