"Chương trình cho một giao diện" có nghĩa là không phụ thuộc vào một loại cụ thể để thực hiện công việc của bạn , nhưng nó không chỉ định cách bạn nên có được sự phụ thuộc của mình.
"Nguyên tắc đảo ngược phụ thuộc" nói rằng một đối tượng không nên kiểm soát việc tạo ra các phụ thuộc của nó, nó chỉ nên quảng cáo những gì phụ thuộc mà nó cần và để người gọi cung cấp nó . Nhưng nó không xác định liệu phụ thuộc nên là một loại cụ thể hay một giao diện.
Tôi sẽ minh họa sự khác biệt với một số mã C #.
Ví dụ sau đây phụ thuộc vào một loại cụ thể và nó kiểm soát việc tạo ra sự phụ thuộc của chính nó. Nó không theo "chương trình giao diện" hay "đảo ngược phụ thuộc":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Ví dụ sau tùy thuộc vào giao diện, nhưng nó kiểm soát việc tạo phụ thuộc của chính nó. Nó theo "chương trình đến một giao diện", nhưng không phải là "đảo ngược phụ thuộc":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Ví dụ sau đây phụ thuộc vào một loại cụ thể, nhưng nó yêu cầu sự phụ thuộc của nó được tạo ra và chuyển cho nó. Nó tuân theo "nghịch đảo phụ thuộc", nhưng không phải là "chương trình cho một giao diện":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
Ví dụ sau đây phụ thuộc vào một giao diện và nó yêu cầu sự phụ thuộc của nó được tạo và chuyển cho nó. Nó tuân theo cả "đảo ngược phụ thuộc" và "chương trình tới một giao diện":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}