"Auf eine Schnittstelle programmieren" bedeutet , dass Sie für Ihre Arbeit nicht von einem konkreten Typ abhängig sind , aber nicht angeben, wie Sie Ihre Abhängigkeit erhalten sollen.
Das "Prinzip der Abhängigkeitsinversion" besagt, dass ein Objekt die Erstellung seiner Abhängigkeiten nicht steuern sollte, sondern nur die benötigte Abhängigkeit ankündigen und vom Aufrufer bereitstellen lassen sollte . Es wird jedoch nicht angegeben, ob die Abhängigkeit ein konkreter Typ oder eine Schnittstelle sein soll.
Ich werde die Unterschiede mit etwas C # -Code veranschaulichen.
Das folgende Beispiel hängt von einem konkreten Typ ab und steuert die Erstellung der eigenen Abhängigkeit. Es folgt weder "Programm auf eine Schnittstelle" noch "Abhängigkeitsinversion":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Das folgende Beispiel hängt von einer Schnittstelle ab, steuert jedoch die Erstellung der eigenen Abhängigkeit. Es folgt "Programm zu einer Schnittstelle", aber nicht "Abhängigkeitsinversion":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Das folgende Beispiel hängt von einem konkreten Typ ab, fordert jedoch an, dass seine Abhängigkeit erstellt und an ihn übergeben wird. Es folgt "Abhängigkeitsinversion", aber nicht "Programmieren auf eine Schnittstelle":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Das folgende Beispiel hängt von einer Schnittstelle ab und fordert dazu auf, dass deren Abhängigkeit erstellt und an diese übergeben wird. Es folgt sowohl "Abhängigkeitsinversion" als auch "Programm auf eine Schnittstelle":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}