"Програма на інтерфейс" означає, що не залежить від конкретного типу для виконання вашої роботи , але він не визначає, як ви повинні отримати свою залежність.
"Принцип інверсії залежності" говорить, що об'єкт не повинен контролювати створення його залежностей, він повинен просто рекламувати, яка залежність йому потрібна, і дозволити абоненту її надати . Але не визначено, чи має залежність бути конкретним типом чи інтерфейсом.
Я проілюструю відмінності деяким C # кодом.
Наступний приклад залежить від конкретного типу, і він контролює створення власної залежності. З цього не випливає ні "програма на інтерфейс", ні "інверсія залежності":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Наступний приклад залежить від інтерфейсу, але він контролює створення власної залежності. З цього випливає "програма на інтерфейс", але не "інверсія залежності":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Наступний приклад залежить від конкретного типу, але він просить створити його залежність і передати їй. Звідси випливає "інверсія залежності", але не "програма на інтерфейс":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Наступний приклад залежить від інтерфейсу, і він просить створити його залежність і передати їй. Звідси випливає як "інверсія залежності", так і "програма до інтерфейсу":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}