"Programma su un'interfaccia" significa che non dipende da un tipo concreto per eseguire il tuo lavoro , ma non specifica come dovresti ottenere la tua dipendenza.
Il "principio di inversione di dipendenza" dice che un oggetto non dovrebbe controllare la creazione delle sue dipendenze, dovrebbe solo indicare quale dipendenza ha bisogno e lasciare che il chiamante fornisca . Ma non specifica se la dipendenza debba essere un tipo concreto o un'interfaccia.
Illustrerò le differenze con un codice C #.
L'esempio seguente dipende da un tipo concreto e controlla la creazione della propria dipendenza. Segue il programma né "a un'interfaccia" né "inversione di dipendenza":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
L'esempio seguente dipende da un'interfaccia, ma controlla la creazione della propria dipendenza. Segue "programma su un'interfaccia", ma non "inversione di dipendenza":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
L'esempio seguente dipende da un tipo concreto, ma richiede che la sua dipendenza venga creata e passata ad essa. Segue "inversione di dipendenza", ma non "programma su un'interfaccia":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
L'esempio seguente dipende da un'interfaccia e richiede che la sua dipendenza sia creata e passata ad essa. Segue sia il programma "inversione di dipendenza" che "a un'interfaccia":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}