„Program do interfejsu” oznacza, że nie zależy od konkretnego rodzaju pracy , ale nie określa, w jaki sposób należy uzyskać zależność.
„Zasada inwersji zależności” mówi, że obiekt nie powinien kontrolować tworzenia swoich zależności, powinien po prostu ogłosić, jakiej zależności potrzebuje i pozwolić, aby osoba dzwoniąca podała ją . Ale nie określa, czy zależność powinna być konkretnym typem, czy interfejsem.
Zilustruję różnice za pomocą kodu C #.
Poniższy przykład zależy od konkretnego typu i kontroluje tworzenie własnej zależności. Wynika ani „programu do interfejsu” ani „zależność inwersji”:
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Poniższy przykład zależy od interfejsu, ale kontroluje tworzenie własnej zależności. Wynika to z „program do interfejsu”, ale nie „inwersja zależności”:
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Poniższy przykład zależy od konkretnego typu, ale prosi o utworzenie i przekazanie zależności. Wynika to z „odwrócenia zależności”, ale nie „program do interfejsu”:
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Poniższy przykład zależy od interfejsu i prosi o utworzenie i przekazanie zależności. Wynika zarówno z „inwersji zależności”, jak i „programu do interfejsu”:
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}