"एक इंटरफेस के लिए कार्यक्रम" का अर्थ है अपने काम करने के लिए एक ठोस प्रकार पर निर्भर नहीं है , लेकिन यह निर्दिष्ट नहीं करता है कि आपको अपनी निर्भरता कैसे प्राप्त करनी चाहिए।
"निर्भरता उलटा सिद्धांत" कहता है कि एक वस्तु को अपनी निर्भरता के निर्माण को नियंत्रित नहीं करना चाहिए, इसे बस यह निर्भर करना चाहिए कि किस निर्भरता की आवश्यकता है और कॉलर को इसे प्रदान करने दें । लेकिन यह निर्दिष्ट नहीं करता है कि निर्भरता एक ठोस प्रकार या एक इंटरफ़ेस होनी चाहिए।
मैं कुछ 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();
}
}