Esiste un beneficio che implementa le interfacce in modo esplicito rispetto all'iniezione delle dipendenze?Implementazione delle dipendenze e implementazione di un'interfaccia esplicita
Per quanto ho capito, le interfacce possono essere implementate in modo esplicito o implicito:
interface IFoo
{
void Bar();
}
//implicit implementation
class Foo1 : IFoo
{
public void Bar(){}
}
//explicit implementation
class Foo2 : IFoo
{
void IFoo.Bar(){}
}
Ora l'implementazione esplicita può essere chiamato solo chiamando il metodo di interfaccia, mentre l'attuazione implicita può essere chiamato direttamente su un istanza della classe:
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();
}
}
Così, usando le implementazioni di interfacce esplicite, non si può accidentalmente chiamare un metodo su una classe concreta, ma si deve chiamare il metodo di interfaccia. Questo impedisce il codice strettamente accoppiato come è uno scopo di DI o sto abbaiando l'albero sbagliato qui? Dopo tutto, non si può accidentalmente scrivere un costruttore o un metodo che ottiene una classe concreta iniettato al posto di un'interfaccia:
class Baz
{
void Ba(Foo2 foo)
{
foo.Bar(); //syntax error
}
void Bb(IFoo foo)
{
foo.Bar();
}
}
Potresti aggiornare il tuo codice per utilizzare IFoo invece di Foo?A mio avviso è confuso ... –
Fatto - scusate, di solito rispetto le convenzioni del codice ... – Thaoden