यदि पहले से ही अमूर्त वर्ग हैं, तो आपको इंटरफ़ेस की आवश्यकता क्यों होगी?
एकाधिक वंशानुक्रम को रोकने के लिए (कई ज्ञात समस्याओं का कारण बन सकता है)।
ऐसी समस्याओं में से एक:
"डायमंड प्रॉब्लम" (कभी-कभी "मौत का घातक हीरा" के रूप में जाना जाता है) एक अस्पष्टता है जो तब उत्पन्न होती है जब ए और क्लास डी से विरासत में दो वर्ग बी और सी दोनों से विरासत में मिलते हैं और अगर ए में कोई विधि है। B और C ने ओवरराइड किया है, और D ने इसे ओवरराइड नहीं किया है, तो D का कौन सा वर्जन इनहेरिट करता है: B का, या C का?
स्रोत: 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()
(इस उदाहरण में) होगी और उसे $personObject
कॉल / उपयोग करने के लिए केवल 1 पैरामीटर ( ) की आवश्यकता होगी ।
एक वर्ग जो एक इंटरफ़ेस को लागू करता है, उसे सभी तरीकों को लागू करना चाहिए, जो इंटरफ़ेस करता है / है।
मुझे आशा है कि मैंने खुद को बहुत अधिक नहीं दोहराया।