2010-06-28 16 views
9

मैं ज्यादातर PHP और पायथन के साथ खेल रहा हूं।इंटरफेस सिर्फ "सिंटेक्टिक शुगर" हैं?

मैं ओओ प्रोग्रामिंग में इंटरफेस के बारे में पढ़ रहा हूं और इसका उपयोग करने में एक लाभ नहीं देख सकता।

एकाधिक वस्तुएं एक ही इंटरफ़ेस को कार्यान्वित कर सकती हैं, लेकिन एकाधिक विरासत इसे भी प्रदान नहीं करती है?

मुझे इंटरफ़ेस "बिना किसी कार्यान्वयन के" बनाने की आवश्यकता क्यों है - मुख्य रूप से एक "अनुबंध" - यदि मैं सिर्फ जांच कर सकता हूं कि पाइथन में किसी ऑब्जेक्ट में कोई विधि मौजूद है, जो एकाधिक कक्षाओं से प्राप्त होती है?

क्या इंटरफेस अन्य भाषाओं में बनाए गए थे क्योंकि वे एकाधिक विरासत प्रदान नहीं करते हैं? या क्या मैं यहाँ कुछ और महत्वपूर्ण याद कर रहा हूँ?

+2

यह काफी विपरीत सवाल है, लेकिन यह अभी भी निकटता से संबंधित है: http://stackoverflow.com/questions/3062701/why-dont-we-require-interfaces-in- गतिशील- भाषाएं – balpha

+0

'सिंथेटिक' क्या है? मैंने गुमराह किया है और कुछ भी नहीं दिखा रहा है ... –

+0

@mrXexxed: सिंटेक्टिक – Joe

उत्तर

11

इंटरफ़ेस की उपयोगिता स्थिर टाइपिंग की उपयोगिता से सीधे जुड़ी हुई है। यदि आप गतिशील रूप से टाइप की गई भाषा जैसे PHP या पायथन में काम कर रहे हैं, तो इंटरफ़ेस वास्तव में भाषा के अभिव्यक्ति में महत्वपूर्ण रूप से जोड़ नहीं करते हैं। यही है, किसी भी प्रोग्राम जिसे इंटरफेस का उपयोग करने के रूप में वर्णित किया जा सकता है इंटरफेस का उपयोग किए बिना महत्वपूर्ण अंतर के बिना व्यक्त किया जा सकता है।

नतीजतन, पायथन में "प्रोटोकॉल" (iteration protocol की तरह एक निश्चित पैटर्न के अनुरूप कार्यान्वयन) की एक काफी घबराहट अवधारणा है, जो अनिवार्य रूप से वही चीज़ है, लेकिन संकलन-समय की जांच के अन्य लाभों के बिना इसका मूल्य सीमित है।

दूसरी ओर, एक स्थिर रूप से टाइप की गई भाषा में, कार्यान्वयन से कार्यान्वयन को अनुमति देने के लिए एक इंटरफ़ेस आवश्यक है। एक स्थैतिक भाषा में, सभी अभिव्यक्तियों के प्रकार संकलन समय पर हल किए जाने चाहिए, इसलिए उस समय कार्यान्वयन के लिए बाध्यकारी समय-समय पर लचीलापन सीमित होना चाहिए। एक इंटरफ़ेस को को विशिष्ट कार्यान्वयन को परिभाषित किए बिना कार्यक्षमता तक पहुंचने के लिए परिभाषित करता है, जो स्थिर भाषा को यह साबित करने की अनुमति देता है कि कार्यान्वयन तक पहुंच के बिना अभिव्यक्ति सही हैं।

इंटरफेस के बिना (या सी ++ के शुद्ध वर्चुअल फ़ंक्शंस जैसे समकक्ष फॉर्मूलेशन), स्थिर रूप से टाइप की गई भाषा की अभिव्यक्ति गंभीर रूप से बाधित होगी।वास्तव में, कई कार्यान्वयन मौजूद हैं (Win32 और COM तुरंत दिमाग में आते हैं) अनिवार्य रूप से संरचनाओं में फ़ंक्शन पॉइंटर्स संग्रहीत करके इंटरफ़ेस और वर्चुअल प्रेषण की कार्यक्षमता को पुन: उत्पन्न करने के लिए (और इस प्रकार सी ++ के वर्चुअल फ़ंक्शन और हाथ से vtable आमंत्रण को फिर से लागू करना) । इस मामले में अभिव्यक्ति में एक बड़ा अंतर है, क्योंकि कार्यक्रम में एक ही अवधारणाओं को व्यक्त करने के लिए कई बदलावों की आवश्यकता होती है।

इंटरफेस टाइप पॉलीमोर्फिज्म का केवल एक उदाहरण है, और उस पर काफी सीमित है। parametric polymorphism (उर्फ जेनेरिक) का समर्थन करने वाली भाषाओं में आप बहुत कुछ हासिल कर सकते हैं। (उदाहरण के लिए, सी # LINQ जेनेरिक इंटरफेस के बिना संभव नहीं होगा।) एक ही तरह की चीज़ के अधिक शक्तिशाली रूप के लिए, हास्केल के typeclasses पर देखें।

+0

+1: * decoupling * यहां कुंजी है। – ladenedge

+2

-1 "इंटरफेस PHP में महत्वपूर्ण मूल्य नहीं जोड़ रहा है" के लिए। –

+2

@ बाय्रॉन: मैं PHP पर कोई विशेषज्ञ नहीं हूं, इसलिए मुझे प्रबुद्ध करें: आप PHP में इंटरफेस के * महत्वपूर्ण * मूल्य के रूप में क्या मानते हैं (बनाम बतख टाइपिंग पाइथन मुहावरे के रूप में)? विशेष रूप से, क्या ऐसे कोई ऑपरेशन हैं जो उनके बिना लागू करने के लिए * असंभव * हैं? –

0

यह आमतौर पर एकाधिक विरासत (सी #) को प्रतिस्थापित करने के लिए लागू किया जाता है। मुझे लगता है कि कुछ भाषाएं/प्रोग्रामर ऑब्जेक्ट स्ट्रक्चर के लिए आवश्यकताओं को लागू करने के तरीके के रूप में भी उनका उपयोग करते हैं।

3

क्योंकि आप program against an interface करना चाहते हैं और नहीं एक ठोस कार्यान्वयन (GoF 1995:18)

+0

hmm last मैंने बड़े सलाहकार सर्वश्रेष्ठ अभ्यास पुस्तक में सुना है कि आप इन दिनों अमूर्त कक्षाओं में कोड करते हैं। – Woot4Moo

+2

@ Woot4Moo: अधिकांश भाषाओं में, इंटरफेस कक्षाएं होती हैं जिनमें उनके सभी विधियां सार होती हैं। यह .NET में बिल्कुल सही नहीं है, हालांकि ... – Powerlord

+0

@ Woot4Moo: यह निर्भर करता है। सार वर्ग अधिक लचीले होते हैं, लेकिन आपको [एकाधिक विरासत से निपटने के लिए मजबूर कर सकते हैं] (http://stackoverflow.com/questions/225929/what-is-the-exact-problem-with-multiple-inheritance/226056#226056) । हमेशा के रूप में, सही नौकरी के लिए सही उपकरण का उपयोग करें! – ladenedge

5

भी अजगर की तरह बतख टाइप भाषाओं में, एक अंतरफलक अपने इरादे का एक स्पष्ट बयान हो सकता है । यदि आपके पास कई कार्यान्वयन हैं, और वे विधियों का एक सेट साझा करते हैं, तो इंटरफ़ेस उन तरीकों के बाहरी व्यवहार को दस्तावेज करने, अवधारणा को एक नाम देने और अवधारणा को ठोस बनाने का एक अच्छा तरीका हो सकता है।

स्पष्ट इंटरफ़ेस के बिना, आपके सिस्टम में एक महत्वपूर्ण अवधारणा है जिसका कोई भौतिक प्रतिनिधित्व नहीं है। इसका मतलब यह नहीं है कि आपको इंटरफेस का उपयोग करना है, लेकिन इंटरफेस उस कंक्रीटेंस प्रदान करते हैं।

13

सबसे पहले, और सबसे महत्वपूर्ण, पाइथन और जावा के बीच तुलना और तुलना करने की कोशिश न करें। वे अलग भाषाएं हैं, विभिन्न अर्थशास्त्र के साथ। तुलना करें और इसके विपरीत केवल इस तरह के भ्रमित प्रश्नों का कारण बन जाएगा जहां आप किसी चीज की तुलना करने की कोशिश कर रहे हैं जो कि कुछ आवश्यक जावा के साथ उपयोग नहीं करता है।

यह संख्या 7 और रंग हरे रंग की तुलना करने जैसा है। वे दोनों संज्ञाएं हैं। इसके अलावा, आपको दोनों की तुलना में परेशानी होगी।

यहां नीचे की रेखा है।

पायथन को इंटरफेस की आवश्यकता नहीं है।

जावा उन्हें आवश्यक है।

एकाधिक वस्तुएं एक ही इंटरफेस को कार्यान्वित कर सकती हैं, लेकिन एकाधिक विरासत इसे भी प्रदान नहीं करती है?

दोनों अवधारणाओं के पास एक दूसरे के साथ लगभग कुछ नहीं करना है।

मैं एक बड़ी संख्या में कक्षाओं को परिभाषित कर सकता हूं जो एक आम इंटरफ़ेस साझा करते हैं। पाइथन में, "बतख टाइपिंग" की वजह से, मुझे सावधानी से यह सुनिश्चित करने की ज़रूरत नहीं है कि उनके पास एक सामान्य सुपरक्लास है।

एक इंटरफ़ेस अलग-अलग वर्ग पदानुक्रमों के लिए "इरादा" की घोषणा है। यह एक सामान्य विनिर्देश प्रदान करता है (जिसे संकलक द्वारा चेक किया जा सकता है) जो कि सरल वर्ग पदानुक्रम का हिस्सा नहीं है। यह कई वर्ग पदानुक्रमों को कुछ सामान्य विशेषताओं को लागू करने और उन सुविधाओं के संबंध में पॉलिमॉर्फिक होने की अनुमति देता है।

पायथन में आप बिना किसी इंटरफेस के हमारे एकाधिक विरासत का उपयोग कर सकते हैं। एकाधिक विरासत में अंतरफलक कक्षाएं शामिल हो सकती हैं या इंटरफ़ेस कक्षाएं शामिल नहीं हो सकती हैं।

जावा में एकाधिक विरासत भी नहीं है। इसके बजाय यह "mixins" नामक एक पूरी तरह से अलग तकनीक का उपयोग करता है। मुख्य रूप से एक "अनुबंध" - - अगर मैं सिर्फ एक विधि पायथन में एक वस्तु, कि कई वर्गों से विरासत में मौजूद रहने पर जांच कर सकते हैं

क्यों मैं "कोई कार्यान्वयन के साथ" एक अंतरफलक बनाने की जरूरत है?

आप अजगर में एक इंटरफेस बनाते हैं तो वह औपचारिक अनुबंध का एक प्रकार हो सकता है। एक दावा है कि सभी सबक्लास पूरी तरह इंटरफ़ेस का दावा करेंगे।

बेशक, एक numbskull झूठ बोलने के लिए पूरी तरह से स्वतंत्र है। वे एक इंटरफेस से उत्तराधिकारी हो सकते हैं और सब कुछ गलत तरीके से लागू कर सकते हैं। सोसायपैथ से बुरा व्यवहार रोकता नहीं है।

आप जावा में एक इंटरफ़ेस बनाते हैं ताकि ऑब्जेक्ट्स के कई वर्गों का सामान्य व्यवहार हो सके। चूंकि आप पाइथन में संकलक को ज्यादा नहीं बताते हैं, इसलिए अवधारणा भी लागू नहीं होती है।

क्या इंटरफेस अन्य भाषाओं में बनाए गए थे क्योंकि वे एकाधिक विरासत प्रदान नहीं करते हैं?

चूंकि अवधारणाएं संबंधित नहीं हैं, इसलिए इसका उत्तर देना मुश्किल है।

जावा में, वे एकाधिक विरासत के बजाय "मिश्रण" का उपयोग करते हैं। "इंटरफ़ेस" अतिरिक्त कार्यक्षमता के कुछ मिश्रण-इन की अनुमति देता है। यह एक इंटरफेस के लिए एक प्रयोग है।

"करता है" से "है" को अलग करने के लिए इंटरफ़ेस का एक अन्य उपयोग। वर्ग पदानुक्रम परिभाषित करता है कि एक वस्तु क्या है। इंटरफ़ेस पदानुक्रम परिभाषित करता है कि कक्षा क्या करती है।

ज्यादातर मामलों में, आईएस और डीओईएस आइसोमोर्फिक हैं, इसलिए कोई भेद नहीं है।

कुछ मामलों में, कोई वस्तु क्या है और कोई वस्तु अलग-अलग होती है।

+1

+1। –

1

हाँ। PHP के लिए, इंटरफेस केवल एकाधिक विरासत की कमी को दूर करने का साधन हैं। आईडीई के लिए मामूली अर्थपूर्ण मतभेद उपयोगी हैं, और इंटरफेस के कारण कम संघर्ष स्पष्ट रूप से नौसिखिया प्रोग्रामर की सहायता करते हैं। लेकिन जैसा कि पहले कहा गया था, यह गतिशील भाषाओं में कड़ाई से जरूरी नहीं है। http://c2.com/cgi/wiki?MultipleInheritance

4

डायनामिक रूप से टाइप की गई भाषाओं में, जैसे PHP और पायथन, इंटरफेस केवल सीमित उपयोग के हैं। आप पहले से किसी भी ऑब्जेक्ट पर विधियों को कॉल करने का प्रयास कर सकते हैं, और यदि यह अस्तित्व में नहीं है तो आपको रन-टाइम त्रुटि मिलती है।

यह जावा और .NET जैसी स्थिर टाइप की गई भाषाओं में है, कि इंटरफेस महत्वपूर्ण हो जाते हैं, क्योंकि विधियों और उनके तर्क संकलन-समय पर चेक किए जाते हैं।

अब, इंटरफेस के लिए:

जावा सरणियों के अलावा List रों है। एक सामान्य नियम के रूप में, सरणी primitives (मुख्य रूप से संख्या प्रकार) के लिए हैं, जबकि List एस वस्तुओं के लिए हैं।

मेरे पास List<String> हो सकता है, जो तारों की एक सूची है। मुझे पता है कि मैं add इसे तार कर सकता हूं, और get इससे वापस तार।

मुझे नहीं पता कि यह कौन सा कार्यान्वयन है। यह एक ArrayList (एक सरणी द्वारा समर्थित सूची), एक LinkedList (एक दोगुना लिंक्ड सूची द्वारा समर्थित सूची), एक CopyOnWriteArrayList (ArrayList का धागा सुरक्षित संस्करण), आदि हो सकता है ...

बहुरूपता और इंटरफेस के लिए धन्यवाद, मुझे यह जानने की आवश्यकता नहीं है कि किस प्रकार का List यह List संचालन करना है।

1

कृपया Twisted Framework पाइथन में ज़ोप इंटरफेस की शक्ति के बारे में लेख पढ़ें।

संबंधित मुद्दे