"Programma su un'interfaccia" significa che non dipende da un tipo concreto per svolgere il tuo lavoro , ma non specifica come ottenere la tua dipendenza.
Il "Principio di inversione di dipendenza" afferma che un oggetto non dovrebbe controllare la creazione delle sue dipendenze, dovrebbe solo pubblicizzare la dipendenza di cui ha bisogno e lasciare che sia il chiamante a fornirlo . Ma non specifica se la dipendenza debba essere un tipo concreto o un'interfaccia.
Illustrerò le differenze con un po 'di codice C #.
L'esempio seguente dipende da un tipo concreto e controlla la creazione della propria dipendenza. Non segue né "programma su 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 a 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 venga creata e passata ad essa. Segue sia "inversione di dipendenza" che "programma a un'interfaccia":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}