यदि पहले से ही सार कक्षाएं हैं, तो आपको इंटरफ़ेस की आवश्यकता क्यों होगी? एकाधिक विरासत को रोकने के लिए (कई ज्ञात समस्याओं का कारण बन सकता है)।
इस तरह की समस्याओं में से एक:
"हीरे समस्या" (कभी कभी " मौत के घातक हीरा" के रूप में) एक अस्पष्टता है कि उठता है जब दो वर्गों बी और सी ए से वारिस है और बी और सी दोनों से कक्षा डी विरासत में है। यदि बी और सी में ए 0 में है, और डी इसे ओवरराइड नहीं करता है, तो विधि का कौन सा संस्करण डी प्राप्त करता है: बी का, या सी ?
स्रोत: https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem
/एक अंतरफलक का उपयोग कब क्यों? एक उदाहरण ... दुनिया की सभी कारों में एक ही इंटरफ़ेस (विधियां) हैं ... AccelerationPedalIsOnTheRight()
, BrakePedalISOnTheLeft()
। कल्पना करें कि प्रत्येक कार ब्रांड में इन "विधियों" को दूसरे ब्रांड से अलग किया जाएगा। बीएमडब्ल्यू के पास दाईं ओर ब्रेक होंगे, और होंडा के पहिये के बाईं तरफ ब्रेक होंगे। लोगों को यह सीखना होगा कि जब भी वे एक अलग ब्रांड कार खरीदते हैं तो ये "विधियां" कैसे काम करती हैं। यही कारण है कि कई "स्थानों" में एक ही इंटरफ़ेस रखना अच्छा विचार है।
आपके लिए एक इंटरफ़ेस क्या करता है (कोई भी एक का उपयोग क्यों करेगा)? एक इंटरफ़ेस आपको "गलतियों" करने से रोकता है (यह आपको आश्वासन देता है कि एक विशिष्ट इंटरफ़ेस को लागू करने वाले सभी वर्गों में सभी के पास इंटरफ़ेस में विधियां होंगी)।
// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{
public function Create($personObject);
}
class MySqlPerson implements IPersonService
{
public function Create($personObject)
{
// Create a new person in MySql database.
}
}
class MongoPerson implements IPersonService
{
public function Create($personObject)
{
// Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
}
}
इस तरह, Create()
विधि हमेशा एक ही तरीके का उपयोग किया जाएगा। इससे कोई फर्क नहीं पड़ता कि हम MySqlPerson
कक्षा या MongoPerson
कक्षा का उपयोग कर रहे हैं। जिस तरह से हम एक विधि का उपयोग कर रहे हैं वही रहता है (इंटरफ़ेस वही रहता है)।
उदाहरण के लिए, इसे इस तरह इस्तेमाल किया जाएगा (हर जगह हमारे कोड में):
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
इस तरह, कुछ इस तरह नहीं हो सकता:
new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);
यह बहुत आसान याद करने के लिए है एक इंटरफ़ेस और कई अलग-अलग लोगों की तुलना में, हर जगह एक ही का उपयोग करें।
इस तरह, Create()
विधि के अंदर "बाहरी" कोड को प्रभावित किए बिना विभिन्न वर्गों के लिए अलग-अलग हो सकता है, जो इस विधि को कॉल करता है। सभी बाहरी कोड को यह जानना है कि विधि Create()
में 1 पैरामीटर ($personObject
) है, क्योंकि बाहरी कोड विधि का उपयोग/कॉल करेगा। बाहरी कोड परवाह नहीं है कि विधि के अंदर क्या हो रहा है; इसे केवल यह जानना है कि इसे कैसे उपयोग/कॉल करना है।
आप बिना इंटरफ़ेस के भी ऐसा कर सकते हैं, लेकिन यदि आप इंटरफ़ेस का उपयोग करते हैं, तो यह "सुरक्षित" है (क्योंकि यह आपको गलतियों को करने से रोकता है)। इंटरफ़ेस आपको आश्वासन देता है कि विधि Create()
में इंटरफ़ेस को लागू करने वाले सभी वर्गों में समान हस्ताक्षर (समान प्रकार और पैरामीटर की एक ही संख्या) होगी।इस तरह आप यह सुनिश्चित कर सकते हैं कि IPersonService
इंटरफ़ेस लागू करने वाली कोई भी कक्षा, विधि Create()
(इस उदाहरण में) होगी और कॉल/उपयोग करने के लिए केवल 1 पैरामीटर ($personObject
) की आवश्यकता होगी।
एक वर्ग जो इंटरफ़ेस लागू करता है उसे सभी विधियों को लागू करना होगा, जो इंटरफ़ेस करता है/है।
मुझे उम्मीद है कि मैंने खुद को दोहराया नहीं है।
आपको इसे पढ़ना होगा: http://stackoverflow.com/a/384067/14673 –
यह सुनिश्चित करें कि यह एक मानसिक सहायता है, और एक संचार सहायता है। इंटरफेस आपके एपीआई के लिए उत्कृष्ट शिक्षण उपकरण के रूप में कार्य करते हैं, क्योंकि वे आपके एपीआई को एक अमूर्त तरीके से एक साथ उजागर करने वाली सेवाओं को बंडल करते हैं जिन्हें कार्यान्वयन के बारे में जानने के बिना पढ़ा जा सकता है। यह महंगा है, लेकिन जो लोग इंटरफेस के साथ सहज हैं, वे कक्षाओं की आवश्यकता के बिना सीधे कार्यों का उपयोग कर सकते हैं, इस प्रकार एक सूचक को बचा सकते हैं। भाषा परिभाषित इंटरफ़ेस के बिना, कई प्रोग्रामर के लिए आगे की योजना बनाना मुश्किल हो सकता है, क्योंकि "ओप भाषा" के लिए उपयोग किए जाने वाले लोग अक्सर पेपर की बजाय इंटरफेस के साथ डिजाइन करना पसंद करते हैं। – Dmitry