इंटरफ़ेस बनाम सार वर्ग (सामान्य ऊ)


1413

मेरे पास हाल ही में दो टेलीफोन साक्षात्कार हैं जहां मुझे एक इंटरफ़ेस और एक सार वर्ग के बीच अंतर के बारे में पूछा गया है। मैंने उनमें से हर एक पहलू के बारे में बताया है जिसके बारे में मैं सोच सकता था, लेकिन ऐसा लगता है कि वे मेरे लिए कुछ विशिष्ट का उल्लेख करने की प्रतीक्षा कर रहे हैं, और मुझे नहीं पता कि यह क्या है।

मेरे अनुभव से मुझे लगता है कि निम्नलिखित सत्य है। अगर मुझे कोई बड़ी बात याद आ रही है तो कृपया मुझे बताएं।

इंटरफेस:

एक इंटरफ़ेस में घोषित हर एक विधि को उपवर्ग में लागू करना होगा। केवल घटनाक्रम, प्रतिनिधि, गुण (C #) और विधियाँ एक अंतरफलक में मौजूद हो सकती हैं। एक वर्ग कई इंटरफेस को लागू कर सकता है।

सार वर्ग:

केवल सार विधियों को उपवर्ग द्वारा लागू किया जाना है। अमूर्त वर्ग में कार्यान्वयन के साथ सामान्य तरीके हो सकते हैं। एब्सट्रैक्ट क्लास में इवेंट्स, डेलीगेट्स, प्रॉपर्टीज़ और मेथड्स के अलावा क्लास वेरिएबल भी हो सकते हैं। एक वर्ग केवल # में बहु-विरासत के गैर-अस्तित्व के कारण एक सार वर्ग को लागू कर सकता है।

  1. आखिरकार, साक्षात्कारकर्ता इस सवाल के साथ आया कि "क्या होगा यदि आपके पास केवल सार विधियों के साथ एक सार वर्ग है? यह एक इंटरफ़ेस से कैसे अलग होगा?" मुझे उत्तर नहीं पता था लेकिन मुझे लगता है कि यह विरासत है जैसा कि ऊपर उल्लेख किया गया है?

  2. एक अन्य साक्षात्कारकर्ता ने मुझसे पूछा कि यदि आपके पास इंटरफ़ेस के अंदर एक सार्वजनिक चर है, तो यह सार क्लास में कैसे भिन्न होगा? मैंने जोर देकर कहा कि आप एक इंटरफेस के अंदर एक सार्वजनिक चर नहीं कर सकते। मुझे नहीं पता था कि वह क्या सुनना चाहता था लेकिन वह या तो संतुष्ट नहीं था।

इसे भी देखें :


412
जबकि मुझे लगता है कि दोनों के बीच अंतर जानना महत्वपूर्ण है, यह एक अच्छा साक्षात्कार प्रश्न नहीं है, इमो। जब तक कि नौकरी OO विषयों पर एक किताब लिख रही थी। आप उन चमगादड़ चमगादड़ों के लिए काम नहीं कर रहे हैं।
एलन

107
@ एलन: मैं वास्तव में एक साक्षात्कार प्रश्न के रूप में इसे पसंद करता हूं, लेकिन मैं किसी को इसके बारे में इस तरह से हाउंड नहीं करूंगा - मैं शायद इसे अधिक पसंद करूंगा "आप एक पदानुक्रम को परिभाषित करते समय एक सार आधार वर्ग पर एक इंटरफ़ेस कहां चुनेंगे? ”, या ऐसा ही कुछ।
रीड कोपसी

11
हो सकता है कि वे एक अधिक डिजाइन केंद्रित उत्तर के बाद थे ... हालांकि आपकी तरह मैंने इसे एक तकनीकी प्रश्न के रूप में माना होगा।
कर्टनडॉग

16
यहाँ अच्छा सारणीबद्ध अंतर: mindprod.com/jgloss/interfacevsabbrid.html
Rajat_R

30
@Kave: I insisted you can't have a public variable inside an interface.मुझे लगता है कि इंटरफ़ेस सार्वजनिक चर हो सकता है। वास्तव में इंटरफ़ेस में चर स्वचालित रूप से सार्वजनिक और अंतिम होते हैं।
एक शिक्षार्थी

जवाबों:


746

हालांकि आपका प्रश्न "सामान्य OO" के लिए इंगित करता है, यह वास्तव में इन शर्तों के .NET उपयोग पर ध्यान केंद्रित करता है।

.NET में (जावा के लिए समान):

  • इंटरफेस का कोई राज्य या कार्यान्वयन नहीं हो सकता है
  • एक वर्ग जो एक इंटरफ़ेस को लागू करता है, उसे उस इंटरफ़ेस के सभी तरीकों को लागू करना होगा
  • अमूर्त वर्गों में राज्य (डेटा सदस्य) और / या कार्यान्वयन (विधियाँ) हो सकती हैं
  • अमूर्त वर्गों को अमूर्त तरीकों को लागू किए बिना विरासत में मिला जा सकता है (हालांकि ऐसा व्युत्पन्न वर्ग अपने आप में सार है)
  • इंटरफेस कई-विरासत वाले हो सकते हैं, अमूर्त वर्ग नहीं हो सकते हैं (यह संभवतया इंटरफेस के लिए महत्वपूर्ण ठोस कारण है जो अलग-अलग कक्षाओं से मौजूद हैं - वे कई विरासतों के कार्यान्वयन की अनुमति देते हैं जो सामान्य एमआई की कई समस्याओं को दूर करता है)।

सामान्य OO शब्दों के रूप में, अंतर जरूरी अच्छी तरह से परिभाषित नहीं हैं। उदाहरण के लिए, C ++ प्रोग्रामर हैं जो समान कठोर परिभाषाएं पकड़ सकते हैं (इंटरफेस अमूर्त वर्गों के एक सख्त उपसमुच्चय हैं जिनमें कार्यान्वयन नहीं हो सकता है), जबकि कुछ कह सकते हैं कि कुछ डिफ़ॉल्ट कार्यान्वयनों के साथ एक सार वर्ग अभी भी एक इंटरफ़ेस या एक गैर-सार है वर्ग अभी भी एक इंटरफ़ेस परिभाषित कर सकता है।

वास्तव में, गैर-आभासी इंटरफ़ेस (एनवीआई) नामक एक सी ++ मुहावरा है जहां सार्वजनिक तरीके गैर-आभासी तरीके हैं जो निजी आभासी तरीकों के लिए 'थंक' हैं:


7
धन्यवाद। मुझे लगता है कि चूंकि आपके उत्तर में राज्य बाकी सभी का अच्छा अवलोकन है, इसलिए मैं आपकी प्रतिक्रिया को अंतिम उत्तर के रूप में चिह्नित करता हूं। आप सही हैं मैंने सामान्य ओओ के लिए कहा, क्योंकि मेरे पहले साक्षात्कारकर्ता ने सामान्य ओओ के लिए कहा था, लेकिन जब से मैं एक सी # आदमी हूं, मैं इसे भूल जाता हूं। ;-) हमेशा सी ++ स्पष्टीकरण के लिए धन्यवाद, जैसा कि हमेशा सी ++ मन उड़ाने वाला होता है।
होउमन

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

82
+1: मैं शर्त लगाने को तैयार हूं कि साक्षात्कार की मेजबानी करने वाले उन बंदरों को यह भी एहसास नहीं है कि अन्य भाषाएं OO को अलग तरीके से लागू करती हैं।
ऑर्बिट

2
@JL मैं नहीं देखता कि समस्या कहाँ है। आपको लगता है कि अमूर्त वर्ग के साथ भ्रमित सार पद्धति है। अमूर्त विधियों का कोई कार्यान्वयन नहीं है। हालांकि, एक अमूर्त वर्ग के अंदर , कुछ तरीके अमूर्त हो सकते हैं (यानी कार्यान्वयन के बिना) जबकि कुछ अन्य वास्तव में कार्यान्वयन हो सकते हैं।
xji

19
ध्यान दें कि जावा 8 में, अब आप इंटरफेस में डिफ़ॉल्ट तरीके और स्थिर तरीके रख सकते हैं जिसका अर्थ है कि जावा इंटरफेस में कार्यान्वयन हो सकता है। संदर्भ यहाँ । जाहिर है कि आपने मुख्य रूप से .NET को संदर्भित किया है, इसलिए यह जावा के लिए केवल एक अवलोकन है।
डेव्टोम जूल

866

कैसे एक सादृश्य के बारे में: जब मैं वायु सेना में था, मैं पायलट प्रशिक्षण के लिए गया और यूएसएएफ (यूएस एयर फोर्स) पायलट बन गया। उस समय मैं कुछ भी उड़ान भरने के लिए योग्य नहीं था, और मुझे विमान प्रकार के प्रशिक्षण में भाग लेना था। एक बार योग्य होने के बाद, मैं एक पायलट (अमूर्त वर्ग) और एक सी -141 पायलट (ठोस वर्ग) था। मेरे एक असाइनमेंट में, मुझे एक अतिरिक्त ड्यूटी दी गई: सुरक्षा अधिकारी। अब मैं एक पायलट और एक सी -141 पायलट था, लेकिन मैंने सुरक्षा अधिकारी कर्तव्यों का पालन भी किया (मैंने बोलने के लिए ISafetyOfficer लागू किया)। एक पायलट को सुरक्षा अधिकारी होने की आवश्यकता नहीं थी, अन्य लोग भी कर सकते थे।

सभी यूएसएफ़ पायलटों को कुछ वायु सेना-व्यापी नियमों का पालन करना पड़ता है, और सभी सी -141 (या एफ -16, या टी -38) पायलट 'यूएसएफ़ पायलट' होते हैं। कोई भी सुरक्षा अधिकारी हो सकता है। इसलिए, संक्षेप में:

  • पायलट: अमूर्त वर्ग
  • C-141 पायलट: ठोस वर्ग
  • ISafety अधिकारी: इंटरफ़ेस

जोड़ा गया नोट: इसका मतलब अवधारणा को समझाने में मदद करने के लिए एक सादृश्य होना था, न कि एक कोडिंग सिफारिश। नीचे विभिन्न टिप्पणियों को देखें, चर्चा दिलचस्प है।


87
मैं वास्तव में इस सादृश्य को पसंद करता हूं, यह थोड़ा जटिल विषय समझाने के लिए एक सरल उदाहरण का उपयोग करता है
केविन बोर्सॉक्स

13
जटिल ओओ शब्दावली को समझने का यह सबसे अच्छा तरीका है। संक्षेप में सभी सिद्धांत केवल तभी सार्थक हैं जब आप इसका उपयोग व्यावहारिक रूप से कर सकते हैं। @ जय तुम rexample वास्तव में काबू करने के लिए आसान है, तो कई बुलेट बिंदु (ज्यादातर अवशोषित होने के बजाय मर्मज्ञ मन!)
बनाम

54
मैं अभी भी थोड़ा उलझन में हूं। कहते हैं, अब आपको F-16 और T-38 योग्यताएं मिल गई हैं, इसलिए अब वर्ग Jayकई वर्गों (C-141 पायलट, F-16 पायलट और T-38 पायलट) से विरासत में नहीं मिल सकता है , तो क्या इसका मतलब है कि जिनकी कक्षाएं इंटरफेस बन जाना चाहिए? धन्यवाद
एलेक्स ओक्रुस्को

37
बहुत से लोगों ने एलेक्स की टिप्पणी के लिए एक +1 दिया है, क्योंकि इससे इस उदाहरण में कुछ कमजोरी का पता चलता है। सबसे पहले, मैं कहूंगा कि जे अपनी श्रेणी के बजाय C-141Pilot का उदाहरण होगा। इसके अतिरिक्त, यूएसएएफ में चूंकि सभी पायलटों में से 99% केवल एक समय में एक विमान में योग्य होते हैं (एफसीएफ और परीक्षण पायलट उल्लेखनीय अपवाद हैं) मैंने कई योग्यताओं पर विचार नहीं किया और इसे कैसे लागू किया जा सकता है। जैसा कि मैं एक पायलट के बारे में जानता हूं, जो 50 साल पहले, एक साथ 25 अलग-अलग विमानों में योग्य था, मुझे लगता है कि इस बात की मिसाल दी जाती है कि हम कैसे एक से अधिक विरासत का उपयोग नहीं करना चाहते हैं।
जे।

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

221

मुझे लगता है कि वे जिस उत्तर की तलाश कर रहे हैं वह मौलिक या ओपीपीएस दार्शनिक अंतर है।

सार वर्ग की विरासत का उपयोग तब किया जाता है जब व्युत्पन्न वर्ग सार वर्ग के मूल गुणों और व्यवहार को साझा करता है। जिस तरह का व्यवहार वास्तव में वर्ग को परिभाषित करता है।

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

उदाहरण के लिए। एक कार और ट्रक एक ऑटोमोबाइल सार वर्ग के कई मुख्य गुणों और व्यवहार को साझा करते हैं, लेकिन वे कुछ परिधीय व्यवहार भी साझा करते हैं जैसे कि जनरेट निकास जो ड्रिलर या पॉवरग्रेनेटर जैसे गैर ऑटोमोबाइल वर्ग भी साझा करते हैं और जरूरी नहीं कि कार या ट्रक को परिभाषित न करें , इसलिए कार, ट्रक, ड्रिलर और पॉवर जेनरेटर सभी एक ही इंटरफ़ेस IExerate साझा कर सकते हैं।


32
मुझे लगता है कि एक और बेहतर सादृश्य "यूज़फुल" होगा जो इंटरफ़ेस की अनुबंध प्रकृति को प्रदर्शित करेगा ।
शुद्ध

@Pureferret अगर accelerateऑटोमोबाइल सार वर्ग के मुख्य व्यवहार का हिस्सा है, तो मैं नहीं कह सकता accelerateकि अनुबंध प्रकृति को दर्शाता है। अनुबंध प्रकृति क्या है? contractजब भी हम बात करते हैं तो इस शब्द को क्यों पेश किया जाता है interface?
ओवरएक्सचेंज

@overexchange क्योंकि आम तौर पर इंटरफ़ेस सिर्फ दो 'सतहों' से मिलता है, लेकिन शब्द अनुबंध का तात्पर्य है कि कैसे दो 'सतहों' मिलते हैं। इसका कोई मतलब नहीं है (कम से कम मेरे लिए) कि निकास उत्पन्न करना कुछ ऐसा है जो आप 'सहमत' हैं। लेकिन यह समझ में आता है (फिर से मेरे लिए) कि आप का उपयोग करने की आवश्यकता पर सहमत हो सकते हैं।
प्यूर्फ्रेट

1
@Pureferret मैं उसी के लिए लिंक पर एक प्रश्न उठाया
ओवरएक्सचेंज

1
@Pureferret अगर interfaceपरिधीय व्यवहार की आवश्यकता है, तो public interface List<E> extends Collection<E> {}कोर व्यवहार का वर्णन करने के लिए क्यों बनाया गया है list? यह वास्तव में प्रसून के जवाब का खंडन है। दोनों Collection<E>और List<E>इंटरफेस यहाँ हैं।
15

198

लघु: समान दिखने वाली कक्षाओं के वर्ग पदानुक्रम की मॉडलिंग के लिए सार कक्षाओं का उपयोग किया जाता है (उदाहरण के लिए पशु अमूर्त वर्ग हो सकता है और मानव, शेर, टाइगर कंक्रीट व्युत्पन्न वर्ग हो सकते हैं)

तथा

इंटरफ़ेस का उपयोग 2 समान / गैर-समान कक्षाओं के बीच संचार के लिए किया जाता है, जो कि प्रकार के वर्ग कार्यान्वयन इंटरफ़ेस के बारे में परवाह नहीं करता है (जैसे ऊंचाई इंटरफ़ेस संपत्ति हो सकती है और इसे मानव, भवन, ट्री द्वारा कार्यान्वित किया जा सकता है। यह कोई फर्क नहीं पड़ता कि आप खा सकते हैं। , आप तैर सकते हैं आप मर सकते हैं या कुछ भी हो सकता है .. यह केवल एक चीज के लिए मायने रखता है जिसके लिए आपको ऊंचाई (आप कक्षा में कार्यान्वयन) की आवश्यकता है।


7
मैं वास्तव में इस सवाल का जवाब है कि यह जवाब देने के लिए कभी कभी मुश्किल है क्योंकि "क्या" इस तरह के रूप में और अधिक सार कुछ को देखकर चीजों के बीच अलग है आशय केवल करने के बजाय, संरचना (के रूप में संरचना की दृष्टि से, एक अंतरफलक और एक शुद्ध सार वर्ग काफी समान हैं चीज़)।
लॉस्टसालड

एक विशिष्ट वर्ग बनाम एक विशिष्ट भाषा में क्या कर सकते हैं, यह कल्पना करना आसान है, लेकिन ऑब्जेक्ट को अर्थ और जिम्मेदारी देने के लिए एक अमूर्त बनाना अधिक कठिन है और आपने जो कहा वह पूरी तरह से OO में 2 अवधारणा के उपयोग को फिर से शुरू करता है। धन्यवाद!
सैमुअल

2
@ धनंजय: मैं देख रहा हूं कि कैसे पशु वर्ग की अवधारणा से ऊँचाई को अलग किया जा सकता है और एक अलग वर्ग से हो सकता है, लेकिन कक्षाओं के बीच "संचार" से आपका वास्तव में क्या मतलब है? यह सिर्फ अपने ही वर्ग के लिए ऊंचाई को परिभाषित कर रहा है, सही है?
TTT

77

कुछ अन्य अंतर हैं -

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

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

एपीआई को तोड़ने के बिना v2 + में सार बेस कक्षाओं को संशोधित किया जा सकता है। इंटरफेस में परिवर्तन परिवर्तन तोड़ रहे हैं।

[सी # / /। नेट विशिष्ट] सार आधार वर्गों के विपरीत इंटरफेस, मूल्य प्रकार (संरचना) पर लागू किया जा सकता है। अमूर्त आधार वर्गों से संरचनाएं विरासत में नहीं मिल सकती हैं। इससे व्यवहार अनुबंधों / उपयोग दिशानिर्देशों को मूल्य प्रकारों पर लागू किया जा सकता है।


5
+1 मुख्य बिंदु के लिए कि एक वर्ग पर एक से अधिक इंटरफ़ेस लागू किया जा सकता है।
cgp

वह मूल आधार कक्षाओं, IMO पर इंटरफेस के लिए एक वास्तविक लाभ है। अन्यथा, मैं .NET डिजाइन दिशानिर्देशों से सहमत हूं, जो अब "इंटरफेस पर सार बेस कक्षाओं को प्राथमिकता देना" कहते हैं
रीड कोप्स

हालाँकि, यह उत्सुक होगा यदि आप इस बिंदु को जोड़ सकते हैं कि यह भी इंटरफेस है किसी भी वर्ग के लिए लागू किया जा सकता है।
cgp

1
@altCognito: यह समझा गया कि दूसरे पैराग्राफ के साथ संभाला गया था। यह मुझे याद दिलाता है, हालांकि, कि इंटरफेस मूल्य प्रकारों पर काम करता है, इसलिए मैंने इसे जोड़ा।
रीड कोपसी

इस सटीक वर्णन के लिए आपका बहुत-बहुत धन्यवाद। यह वास्तव में बहुत मददगार है। मैं यहाँ नया हूँ। यह एक दया है कि आप "जवाब" के रूप में दो प्रतिक्रियाओं का चयन नहीं कर सकते। एक बात जो मुझे भ्रमित करती है वह है आपका 'एब्सट्रैक्ट' बेस 'क्लास का उपयोग। सभी अमूर्त वर्गों को एक उपवर्ग का एक आधार वर्ग माना जाता है। N आधार ’का नामकरण अतिरिक्त क्यों?
होउमैन

68

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

public class Vehicle {
    private Driver driver;
    private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
    //You can define as many properties as you want here ...
}

अब एक साइकिल ...

public class Bicycle extends Vehicle {
    //You define properties which are unique to bicycles here ...
    private Pedal pedal;
}

और एक कार ...

public class Car extends Vehicle {
    private Engine engine;
    private Door[] doors;
}

यह सब Inheritance के बारे में है । हम उनका उपयोग वस्तुओं को सरल आधार रूपों और उनके बच्चों में वर्गीकृत करने के लिए करते हैं जैसा कि हमने ऊपर देखा।

सार वर्ग

सार वर्ग अपूर्ण वस्तुएं हैं। इसे और समझने के लिए, आइए एक बार फिर से वाहन सादृश्य पर विचार करें।
एक वाहन चलाया जा सकता है। सही? लेकिन अलग-अलग वाहनों को अलग-अलग तरीकों से चलाया जाता है ... उदाहरण के लिए, आप वैसे ही कार नहीं चला सकते जैसे आप साइकिल चलाते हैं।
तो एक वाहन के ड्राइव फ़ंक्शन का प्रतिनिधित्व कैसे करें? यह जांचना कठिन है कि यह किस प्रकार का वाहन है और इसे अपने स्वयं के फ़ंक्शन के साथ चलाएं; नए प्रकार के वाहन जोड़ने पर आपको बार-बार चालक वर्ग बदलना होगा।
यहाँ अमूर्त वर्गों और विधियों की भूमिका आती है। आप ड्राइव विधि को सार के रूप में परिभाषित कर सकते हैं, यह बताने के लिए कि प्रत्येक विरासत वाले बच्चों को इस फ़ंक्शन को लागू करना होगा।
तो अगर आप वाहन वर्ग को संशोधित करते हैं ...

//......Code of Vehicle Class
abstract public void drive();
//.....Code continues

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

Interfaces Interfaces पूरी तरह से अधूरी हैं। उनके पास कोई गुण नहीं है। वे सिर्फ संकेत देते हैं कि विरासत में मिले बच्चे कुछ करने में सक्षम हैं ...
मान लीजिए कि आपके पास विभिन्न प्रकार के मोबाइल फोन हैं। उनमें से प्रत्येक के अलग-अलग कार्य करने के अलग-अलग तरीके हैं; Ex: किसी व्यक्ति को कॉल करें फोन का निर्माता यह निर्दिष्ट करता है कि उसे कैसे करना है। यहां मोबाइल फोन एक नंबर डायल कर सकता है - वह है, यह डायल-सक्षम है। आइए इसे एक इंटरफ़ेस के रूप में दर्शाते हैं।

public interface Dialable {
    public void dial(Number n);
}

यहां डायल करने वाला निर्माता एक नंबर डायल करने के तरीके को परिभाषित करता है। बस आपको इसे डायल करने के लिए एक नंबर देना होगा।

// Makers define how exactly dialable work inside.

Dialable PHONE1 = new Dialable() {
    public void dial(Number n) {
        //Do the phone1's own way to dial a number
    }
}

Dialable PHONE2 = new Dialable() {
    public void dial(Number n) {
        //Do the phone2's own way to dial a number
    }
}


//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
    Dialable myDialable = SomeLibrary.PHONE1;
    SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....

एब्सट्रैक्ट क्लासेस के बजाय इंटरफेस का उपयोग करते हुए, फ़ंक्शन के लेखक जो एक डायल करने योग्य आवश्यकता का उपयोग करता है, उसके गुणों के बारे में चिंता नहीं करता है। Ex: क्या इसमें टच-स्क्रीन या डायल पैड है, क्या यह एक निश्चित लैंडलाइन फोन या मोबाइल फोन है। आपको यह जानना चाहिए कि क्या यह डायल करने योग्य है; यह डायलिबल इंटरफ़ेस को इनहेरिट (या कार्यान्वित) करता है।

और इससे भी महत्वपूर्ण बात यह है कि अगर किसी दिन आप डायलॉग को किसी दूसरे के साथ स्विच करते हैं

......
public static void main(String[] args) {
    Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
    SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....

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

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

अधिक जानकारी सार कक्षाएं बनाम इंटरफेस


यह सच नहीं है कि "इंटरफेस में कोई गुण नहीं है"।
बिगयेस

@ बाइजेस, जावा इंटरफेस में गुणों की अनुमति नहीं देता है। मुझे लगा कि अन्य भाषाओं में भी ऐसा ही है। क्या आप कृपया अधिक बता सकते हैं?
fz_salam

मैं C # /। नेट की बात कर रहा हूं। कृपया उदाहरण
Bigeyes

C # के लिए @Bigeyes जहां इंटरफेस में गुण हो सकते हैं, क्या यह एकाधिक वंशानुक्रम समस्या को फिर से प्रस्तुत नहीं करता है? क्या होता है जब एक वर्ग कई इंटरफेस का उपयोग करता है जो एक ही संपत्ति को परिभाषित करते हैं? बस जिज्ञासु धन्यवाद
स्टैकपशर

@happycoder: re: "यहां अमूर्त वर्गों के बजाय इंटरफेस का उपयोग करके, आपको इसके गुणों के बारे में चिंता करने की आवश्यकता नहीं है। एक्स: क्या इसमें टच-स्क्रीन या डायल पैड है, क्या यह एक निश्चित लैंडलाइन फोन या मोबाइल फोन है। आपको बस जरूरत है। यदि यह डायल करने योग्य है, तो जान लें; क्या यह डायलएबल इंटरफ़ेस को इनहेरिट (या कार्यान्वित) करता है। " - क्या आप इसे एक कोड उदाहरण में दिखा सकते हैं, यह भी नहीं देखा कि यह कैसे विरासत में मिलेगा ...
TTT

45

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

Oracle वेबसाइट , वर्ग interfaceऔर abstractवर्ग के बीच महत्वपूर्ण अंतर प्रदान करती है ।

अमूर्त कक्षाओं का उपयोग करने पर विचार करें यदि:

  1. आप कई निकट संबंधित वर्गों के बीच कोड साझा करना चाहते हैं।
  2. आप उम्मीद करते हैं कि आपके अमूर्त वर्ग का विस्तार करने वाले वर्गों के पास कई सामान्य तरीके या क्षेत्र हैं, या उन्हें सार्वजनिक (जैसे संरक्षित और निजी) के अलावा अन्य पहुँच संशोधक की आवश्यकता होती है।
  3. आप गैर-स्थिर या गैर-अंतिम फ़ील्ड घोषित करना चाहते हैं।

यदि इंटरफेस का उपयोग करने पर विचार करें :

  1. आप उम्मीद करते हैं कि असंबंधित वर्ग आपके इंटरफ़ेस को लागू करेंगे। उदाहरण के लिए, कई असंबंधित ऑब्जेक्ट Serializableइंटरफ़ेस को लागू कर सकते हैं ।
  2. आप एक विशेष डेटा प्रकार के व्यवहार को निर्दिष्ट करना चाहते हैं, लेकिन इसके व्यवहार को लागू करने के बारे में चिंतित नहीं हैं।
  3. आप कई प्रकार की विरासत का लाभ उठाना चाहते हैं।

सरल शब्दों में, मैं उपयोग करना चाहूंगा

इंटरफ़ेस: कई असंबंधित वस्तुओं द्वारा एक अनुबंध को लागू करने के लिए

अमूर्त वर्ग: कई संबंधित वस्तुओं के बीच एक ही या अलग व्यवहार को लागू करने के लिए

चीजों को स्पष्ट तरीके से समझने के लिए कोड उदाहरण पर एक नज़र डालें: मुझे एक इंटरफ़ेस और एक सार वर्ग के बीच अंतर कैसे समझाया जाना चाहिए?


33

साक्षात्कारकर्ता एक अजीब पेड़ को भौंक रहे हैं। C # और Java जैसी भाषाओं के लिए, एक अंतर है, लेकिन C ++ जैसी अन्य भाषाओं में नहीं है। OO सिद्धांत दोनों को अलग नहीं करता है, केवल भाषा का वाक्य विन्यास है।

एक अमूर्त वर्ग कार्यान्वयन और इंटरफ़ेस (शुद्ध आभासी तरीकों) दोनों के साथ एक वर्ग है जो विरासत में मिलेगा। इंटरफेस में आमतौर पर कोई कार्यान्वयन नहीं होता है, लेकिन केवल शुद्ध आभासी कार्य होते हैं।

C # या Java में बिना किसी कार्यान्वयन के एक अमूर्त वर्ग केवल एक इंटरफ़ेस से भिन्न होता है जिसका उपयोग सिंटैक्स में किया जाता है और इसे आप केवल एक से प्राप्त कर सकते हैं।


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

31

इंटरफेस को लागू करने से आप विरासत के बजाय रचना ("एक-एक" रिश्ते) प्राप्त कर रहे हैं ("एक-एक" रिश्ते)। यह याद रखने का एक महत्वपूर्ण सिद्धांत है कि जब डिजाइन पैटर्न जैसी चीजें आती हैं, तो आपको विरासत के बजाय व्यवहार की संरचना को प्राप्त करने के लिए इंटरफेस का उपयोग करने की आवश्यकता होती है।


17
Interfaces हासिल करते हैं, IMO, "Acts-as-a" रिलेशनशिप के। एनकैप्सुलेशन एक इंटरफ़ेस से बेहतर रचना प्राप्त करता है।
रीड कोपसी

12
मुझे नहीं लगता कि इंटरफेस लागू करना रचना के अंतर्गत आएगा।
पावन दित्तकवि

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

26

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

  1. जब हमें इंटरफ़ेस का उपयोग करना चाहिए?

    यदि आप कार्यान्वयन के बारे में नहीं जानते हैं तो हमारे पास आवश्यकता विनिर्देश हैं तो हम इंटरफ़ेस के साथ जाते हैं

  2. जब हमें Abstract क्लास का उपयोग करना चाहिए?

    यदि आप कार्यान्वयन जानते हैं, लेकिन पूरी तरह से नहीं (आंशिक रूप से कार्यान्वयन) तो हम सार वर्ग के साथ चलते हैं।

    इंटरफेस

    डिफ़ॉल्ट सार्वजनिक अमूर्त द्वारा हर विधि का मतलब है कि इंटरफ़ेस 100% शुद्ध सार है।

    सार

    ठोस विधि और सार विधि हो सकती है, कंक्रीट विधि क्या है, जिसका सार वर्ग में कार्यान्वयन है, एक सार वर्ग एक ऐसा वर्ग है जिसे सार घोषित किया गया है - इसमें सार विधियां शामिल हो सकती हैं या नहीं भी हो सकती हैं।

    इंटरफेस

    हम इंटरफ़ेस को एक निजी, संरक्षित घोषित नहीं कर सकते

    प्र। हम इंटरफेस को निजी और संरक्षित घोषित क्यों नहीं कर रहे हैं?

    क्योंकि डिफ़ॉल्ट इंटरफ़ेस विधि सार्वजनिक सार है इसलिए और इसलिए कि हम इंटरफ़ेस को निजी और संरक्षित घोषित नहीं कर रहे हैं।

    इंटरफ़ेस विधि
    भी हम इंटरफ़ेस को निजी, संरक्षित, अंतिम, स्थिर, सिंक्रनाइज़, मूल ..... घोषित नहीं कर सकते

    मैं इसका कारण बताऊंगा: क्यों हम सिंक्रनाइज़ किए गए तरीके की घोषणा नहीं कर रहे हैं क्योंकि हम इंटरफ़ेस का ऑब्जेक्ट नहीं बना सकते हैं और सिंक्रोनाइज़ करना ऑब्जेक्ट पर काम कर रहे हैं इसलिए और बेटा कारण है कि हम सिंक्रनाइज़ किए गए तरीके की घोषणा नहीं कर रहे हैं।

    सार

    हम खुशी से सार्वजनिक, निजी अंतिम स्थैतिक के साथ उपयोग कर रहे हैं .... इसका मतलब यह है कि अमूर्त में कोई प्रतिबंध लागू नहीं है।

    इंटरफेस

    चर इंटरफ़ेस में डिफ़ॉल्ट रूप से सार्वजनिक स्थैतिक फाइनल के रूप में घोषित किए जाते हैं, इसलिए हमें एक निजी, संरक्षित के रूप में चर भी घोषित नहीं किया जाता है।

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

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

    सार

    सार चर को सार्वजनिक स्थैतिक फाइनल घोषित करने की आवश्यकता नहीं है।

मुझे उम्मीद है कि यह लेख उपयोगी है।


4
मैं इस बात से असहमत हूं: Abstract class must have at lease one abstract method.जब तक आप इसे लागू करते हैं, तब तक एक सार पद्धति के बिना एक सार वर्ग होना संभव है। संदर्भ: An abstract class is a class that is declared abstract—it may or may not include abstract methods.संदर्भ स्रोत: docs.oracle.com/javase/tutorial/java/IandI/abstract.html
Devner

आप तकनीकी विवरण और कार्यान्वयन के बारे में बात कर रहे हैं, आप सामान्य
ओओपी के

26

वैचारिक रूप से, किसी भी या दोनों का उपयोग करके भाषा के विशिष्ट कार्यान्वयन, नियमों, लाभों और किसी भी प्रोग्रामिंग लक्ष्य को प्राप्त करना, कर सकते हैं या कैंट में कोड / डेटा / संपत्ति, ब्ला ब्ला, एकल या कई विरासत, सभी एक तरफ हो सकते हैं।

1- सार (या शुद्ध सार) वर्ग पदानुक्रम को लागू करने के लिए है। यदि आपके व्यवसाय की वस्तुएं कुछ संरचनात्मक रूप से समान दिखती हैं, तो माता-पिता-बच्चे (पदानुक्रम) के संबंध का प्रतिनिधित्व करते हुए केवल विरासत / सार वर्ग का उपयोग किया जाएगा। यदि आपके व्यवसाय मॉडल में पदानुक्रम नहीं है, तो वंशानुक्रम का उपयोग नहीं किया जाना चाहिए (यहां मैं प्रोग्रामिंग तर्क के बारे में बात नहीं कर रहा हूं जैसे कुछ डिजाइन पैटर्न को विरासत की आवश्यकता होती है)। वैचारिक रूप से, सार वर्ग OOP में एक बिजनेस मॉडल के पदानुक्रम को लागू करने का एक तरीका है, इसका इंटरफेसेस से कोई लेना-देना नहीं है, वास्तव में Abstract क्लास को इंटरफ़ेस के साथ तुलना करना व्यर्थ है क्योंकि दोनों वैचारिक रूप से पूरी तरह से अलग चीजें हैं, यह साक्षात्कारों में सिर्फ अवधारणाओं की जांच करने के लिए कहा जाता है क्योंकि यह दिखता है कि दोनों कुछ समान कार्यक्षमता प्रदान करते हैं जब कार्यान्वयन संबंधित होता है और हम प्रोग्रामर आमतौर पर कोडिंग पर अधिक जोर देते हैं। [इसे ध्यान में रखें कि एब्सट्रैक्शन एब्सट्रैक्ट क्लास से अलग है]।

2- एक इंटरफेस एक अनुबंध है, एक पूर्ण व्यावसायिक कार्यक्षमता जो एक या अधिक कार्यों के समूह द्वारा प्रस्तुत की जाती है। यही कारण है कि इसे लागू किया गया है और विरासत में नहीं मिला है। एक व्यावसायिक वस्तु (एक पदानुक्रम का हिस्सा या नहीं) में पूर्ण व्यावसायिक कार्यक्षमता की कोई संख्या हो सकती है। इसका अमूर्त वर्गों से कोई लेना-देना नहीं है, जिसका अर्थ है सामान्य तौर पर विरासत। उदाहरण के लिए, एक मानव RUN कर सकता है, एक हाथी RUN कर सकता है, एक पक्षी RUN कर सकता है, और इसी तरह, विभिन्न पदानुक्रम की ये सभी वस्तुएँ RUN इंटरफ़ेस या EAT या SPEAK इंटरफ़ेस को कार्यान्वित करेंगी। कार्यान्वयन में मत जाओ क्योंकि आप इन इंटरफेस को लागू करने वाले प्रत्येक प्रकार के लिए अमूर्त वर्ग के रूप में इसे लागू कर सकते हैं। किसी भी पदानुक्रम की वस्तु में कार्यक्षमता (इंटरफ़ेस) हो सकती है, जिसका पदानुक्रम से कोई लेना-देना नहीं है।

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

जब आपसे अंतर के बारे में पूछा जाता है, तो यह वास्तव में वैचारिक अंतर है जब तक कि स्पष्ट रूप से नहीं पूछा जाता है।

मेरा मानना ​​है कि, दोनों साक्षात्कारकर्ता इन दोनों के बीच एक पंक्ति के सीधे अंतर की उम्मीद कर रहे थे और जब आप असफल हो गए तो उन्होंने आपको वन के रूप में लागू करके इस अंतर को दूर करने की कोशिश की

क्या होगा यदि आपके पास केवल सार विधियों के साथ एक सार वर्ग था?


इस सवाल का जवाब बहुत अच्छी तरह से बहुत ज्यादा है।
प्रणव

कार्यक्षमता लागू संरचना बनाम विस्तारित, अच्छा!
harshvchawla

21

.Net के लिए,

दूसरे साक्षात्कारकर्ता को आपका उत्तर भी पहले एक का उत्तर है ... सार वर्गों में कार्यान्वयन, और स्थिति हो सकती है, इंटरफेस नहीं हो सकता ...

संपादित करें: एक अन्य नोट पर, मैं उन वर्गों का वर्णन करने के लिए 'उपवर्ग' (या 'वंशानुक्रम' वाक्यांश) का उपयोग नहीं करूंगा जो एक इंटरफ़ेस को लागू करने के लिए परिभाषित हैं। मेरे लिए, एक इंटरफ़ेस एक अनुबंध की परिभाषा है जिसे एक वर्ग को उस इंटरफ़ेस के 'कार्यान्वयन' के लिए परिभाषित किया गया है, जिसके अनुरूप होना चाहिए। यह कुछ भी वारिस नहीं करता है ... आपको खुद को स्पष्ट रूप से सब कुछ जोड़ना होगा।


2
हाँ! राज्य! दूसरे इंटरव्यूअर का मतलब था कि एक इंटरफेस के अंदर "सार्वजनिक चर" कहने के अपने अजीब तरीके से। भगवान! अमूर्त वर्गों में राज्य हो सकते हैं, इंटरफेस नहीं हो सकते हैं! और हाँ, बाकी सब भी विरासत के अपने तरीकों के बीच के अंतरों पर सहमत हैं, जिन्हें मैं उल्लेख करना भूल गया था, लेकिन बाद में पता चला। :) सभी को धन्यवाद!
होउमैन

4
केवल राज्य से अधिक .... सार वर्गों में प्रभाव हो सकता है। यानी, उनके पास कोड वाली विधियाँ हो सकती हैं जो वास्तव में चलती हैं और कुछ ऐसा करती हैं, जो आधार वर्गों के उदाहरणों द्वारा अमानवीय और निष्पादित हो जाता है ... इंटरफेस के साथ ऐसा नहीं है
चार्ल्स ब्रेटाना

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

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

20

इंटरफ़ेस : का उपयोग किया जाना चाहिए यदि आप घटकों पर एक नियम लागू करना चाहते हैं जो एक दूसरे से संबंधित हो सकते हैं या नहीं हो सकते हैं

पेशेवरों:

  1. एकाधिक वंशानुक्रम की अनुमति देता है
  2. संदर्भ में किस तरह की वस्तु का उपयोग किया जा रहा है, इसे उजागर नहीं करके अमूर्तता प्रदान करता है
  3. अनुबंध के एक विशिष्ट हस्ताक्षर द्वारा स्थिरता प्रदान करता है

विपक्ष:

  1. परिभाषित सभी अनुबंधों को लागू करना चाहिए
  2. इसमें चर या प्रतिनिधि नहीं हो सकते
  3. एक बार परिभाषित करने के बाद सभी वर्गों को तोड़े बिना बदला नहीं जा सकता

सार वर्ग : का उपयोग किया जाना चाहिए जहां आप कुछ बुनियादी या डिफ़ॉल्ट व्यवहार या एक दूसरे से संबंधित घटकों के लिए कार्यान्वयन करना चाहते हैं

पेशेवरों:

  1. इंटरफ़ेस की तुलना में तेज़
  2. कार्यान्वयन में लचीलापन है (आप इसे पूरी तरह या आंशिक रूप से लागू कर सकते हैं)
  3. व्युत्पन्न वर्गों को तोड़े बिना आसानी से बदला जा सकता है

विपक्ष:

  1. तत्काल नहीं किया जा सकता
  2. एकाधिक वंशानुक्रम का समर्थन नहीं करता है

तेजी से परिभाषित करें। क्या यह महत्वपूर्ण है? इसका क्या मतलब है? एक अमूर्त वर्ग पर फंक्शन इनवोकेशन के लिए ओपकोड एक इंटरफेस पर फंक्शन इनवोकेशन के लिए ओपोड की तुलना में तेज है?
डेनिस 631

@ denis631 अमूर्त वर्ग इंटरफ़ेस की तुलना में थोड़ा तेज़ है क्योंकि खोज और कॉल इंटरफ़ेस विधि के भीतर शामिल है। इस कोडरन को पढ़िए। http://www.t/503450/java/abstract-class-faster-interface
bourax webmaster

17

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

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

अमूर्त वर्ग: का उपयोग केवल उसी उत्तरदायित्व की कक्षाओं के बीच कुछ कोड को फैक्टर करने के लिए किया जाता है। ध्यान दें कि यह मुख्य कारण है कि कई-विरासत OOP में एक बुरी बात है, क्योंकि एक वर्ग को कई जिम्मेदारियों को नहीं संभालना चाहिए ( इसके बजाय संरचना का उपयोग करें )।

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


13
After all that, the interviewer came up with the question "What if you had an 
Abstract class with only abstract methods? How would that be different
from an interface?" 

डॉक्स स्पष्ट रूप से कहते हैं कि अगर एक सार वर्ग में केवल अमूर्त विधि घोषणाएं शामिल हैं, तो इसे एक इंटरफ़ेस के रूप में घोषित किया जाना चाहिए।

An another interviewer asked me what if you had a Public variable inside
the interface, how would that be different than in Abstract Class?

इंटरफेसेस में चर डिफ़ॉल्ट रूप से सार्वजनिक स्थैतिक और अंतिम होते हैं। प्रश्न को फंसाया जा सकता है जैसे कि अगर सार वर्ग के सभी चर सार्वजनिक हैं तो क्या होगा? खैर वे अभी भी इंटरफेस में चर के विपरीत गैर स्थिर और गैर अंतिम हो सकते हैं।

अंत में मैं ऊपर उल्लेखित लोगों के लिए एक और बिंदु जोड़ूंगा - अमूर्त वर्ग अभी भी वर्ग हैं और एक ही वंशानुक्रम के पेड़ में गिरते हैं जबकि इंटरफेस कई विरासत में मौजूद हो सकते हैं।


13
  1. इंटरफेस:
    • हम तरीकों को लागू (या परिभाषित) नहीं करते हैं, हम इसे व्युत्पन्न वर्गों में करते हैं।
    • हम इंटरफेस में सदस्य चर घोषित नहीं करते हैं।
    • इंटरफेस एचए-ए संबंध को व्यक्त करते हैं। इसका मतलब है कि वे वस्तुओं का मुखौटा हैं।
  2. सार वर्ग:
    • हम सार वर्ग में विधियों को घोषित और परिभाषित कर सकते हैं।
    • हम इसके निर्माणकर्ताओं को छिपाते हैं। अर्थात इससे प्रत्यक्ष रूप से कोई वस्तु नहीं बनी है।
    • अमूर्त वर्ग सदस्य चर धारण कर सकते हैं।
    • व्युत्पन्न वर्ग सार वर्ग के लिए विरासत में मिला है, जिसका अर्थ है कि व्युत्पन्न वर्गों से वस्तुओं को नकाब नहीं किया जाता है, यह सार वर्ग को विरासत में मिलता है। इस मामले में संबंध आईएस-ए है।

ये मेरा विचार हे।


12

जेफरी रिक्टर द्वारा C # के माध्यम से CLR से कॉपी किया गया ...

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

यहां कुछ दिशानिर्देश दिए गए हैं जो आपकी मदद कर सकते हैं:

■ 日 IS-A बनाम CAN-DO संबंध एक प्रकार से केवल एक कार्यान्वयन विरासत में मिल सकता है। यदि व्युत्पन्न प्रकार आधार प्रकार के साथ आईएस-ए संबंध का दावा नहीं कर सकता है, तो आधार प्रकार का उपयोग न करें; एक इंटरफ़ेस का उपयोग करें। इंटरफेस एक CAN-DO संबंध का अर्थ है। यदि CAN-DO कार्यक्षमता विभिन्न ऑब्जेक्ट प्रकारों से संबंधित है, तो इंटरफ़ेस का उपयोग करें। उदाहरण के लिए, एक प्रकार स्वयं के उदाहरणों को दूसरे प्रकार में परिवर्तित कर सकता है (IConvertible), एक प्रकार स्वयं के उदाहरण (ISerializable) को अनुक्रमित कर सकता है, ध्यान दें कि मान प्रकार System.ValueType से प्राप्त होने चाहिए, और इसलिए, उन्हें व्युत्पन्न नहीं किया जा सकता है। एक मनमाना आधार वर्ग से। इस स्थिति में, आपको CAN-DO संबंध का उपयोग करना चाहिए और इंटरफ़ेस को परिभाषित करना चाहिए।

■■ उपयोग में आसानी यह एक इंटरफ़ेस के सभी तरीकों को लागू करने की तुलना में एक आधार प्रकार से प्राप्त एक नए प्रकार को परिभाषित करने के लिए एक डेवलपर के रूप में आपके लिए आम तौर पर आसान है। आधार प्रकार बहुत अधिक कार्यक्षमता प्रदान कर सकता है, इसलिए व्युत्पन्न प्रकार को संभवतः अपने व्यवहार में केवल अपेक्षाकृत छोटे संशोधनों की आवश्यकता होती है। यदि आप एक इंटरफ़ेस की आपूर्ति करते हैं, तो नए प्रकार को सभी सदस्यों को लागू करना होगा।

■ 日 लगातार कार्यान्वयन कोई फर्क नहीं पड़ता कि कितनी अच्छी तरह से एक इंटरफ़ेस अनुबंध प्रलेखित है, यह बहुत संभावना नहीं है कि हर कोई अनुबंध को 100 प्रतिशत सही ढंग से लागू करेगा। वास्तव में, COM इस समस्या से ग्रस्त है, यही वजह है कि कुछ COM ऑब्जेक्ट केवल माइक्रोसॉफ्ट वर्ड या विंडोज इंटरनेट एक्सप्लोरर के साथ सही ढंग से काम करते हैं। एक अच्छा डिफ़ॉल्ट कार्यान्वयन के साथ एक आधार प्रकार प्रदान करके, आप उस प्रकार का उपयोग करना शुरू करते हैं जो काम करता है और अच्छी तरह से परीक्षण किया जाता है; फिर आप उन भागों को संशोधित कर सकते हैं जिन्हें संशोधन की आवश्यकता है।

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


1
@AbdullahShoaib एक है और कोई भी कर सकता है, लेकिन नहीं कर सकता है, यहाँ एक अंतर है। यह मूल कारण है, हमें इंटरफ़ेस की आवश्यकता है। व्यवहार कर सकते हैं के abstract classरूप में अच्छी तरह से हिस्सा होगा ।
ओवरएक्सचेंज

10

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

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

सी # इंटरफ़ेस विरासत के लिए भी अनुमति देता है, आप मन।


1
क्षैतिज और ऊर्ध्वाधर शब्दों का उपयोग करने से अंतर की कल्पना करना बहुत स्पष्ट हो गया।
Infinity

10

अधिकांश उत्तर सार वर्ग और इंटरफ़ेस के बीच तकनीकी अंतर पर ध्यान केंद्रित करते हैं , लेकिन तकनीकी रूप से, एक इंटरफ़ेस मूल रूप से एक सार वर्ग (किसी भी डेटा या कार्यान्वयन के बिना एक) है, मुझे लगता है कि वैचारिक अंतर कहीं अधिक दिलचस्प है, और यही हो सकता है साक्षात्कारकर्ता बाद में हैं।

एक इंटरफ़ेस एक समझौता है । यह निर्दिष्ट करता है: "यह है कि हम एक दूसरे से बात करने जा रहे हैं"। इसका कोई कार्यान्वयन नहीं हो सकता है क्योंकि इसका कोई कार्यान्वयन नहीं होना चाहिए । यह एक अनुबंध है। यह .hC में हेडर फाइलों की तरह है।

एक सार वर्ग एक अपूर्ण कार्यान्वयन है । एक वर्ग एक इंटरफ़ेस को लागू कर सकता है या नहीं कर सकता है, और एक सार वर्ग को इसे पूरी तरह से लागू नहीं करना है। बिना किसी कार्यान्वयन के एक सार वर्ग एक तरह से बेकार है, लेकिन पूरी तरह से कानूनी है।

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

तथ्य यह है कि पर्दे के पीछे, एक इंटरफ़ेस मूल रूप से केवल सार विधियों के साथ एक सार वर्ग है, इससे कोई फर्क नहीं पड़ता। वैचारिक रूप से, वे पूरी तरह से अलग-अलग भूमिकाएँ भरते हैं।


10

जैसा कि आप विशेषज्ञों से सैद्धांतिक ज्ञान प्राप्त कर सकते हैं, मैं उन सभी को यहां दोहराने में ज्यादा शब्द खर्च नहीं कर रहा हूं, बल्कि मुझे एक सरल उदाहरण के साथ समझाएं जहां हम उपयोग कर सकते हैं / Interfaceऔर उपयोग नहीं कर सकते हैं Abstract class

विचार करें कि आप कारों की सभी विशेषताओं को सूचीबद्ध करने के लिए एक एप्लिकेशन डिज़ाइन कर रहे हैं। विभिन्न बिंदुओं में आपको सामान्य रूप से इनहेरिटेंस की आवश्यकता होती है, क्योंकि कुछ गुण जैसे कि DigitalFuelMeter, Air कंडीशनिंग, सीट समायोजन, आदि सभी कारों के लिए सामान्य हैं। इसी तरह, हमें कुछ वर्गों के लिए विरासत की आवश्यकता है क्योंकि कुछ संपत्तियां जैसे ब्रेकिंग सिस्टम (ABS, EBD) केवल कुछ कारों के लिए लागू होती हैं।

निम्न वर्ग सभी कारों के लिए आधार वर्ग के रूप में कार्य करता है:

public class Cars
{
    public string DigitalFuelMeter()
    {
        return "I have DigitalFuelMeter";
    }

    public string AirCondition()
    {
        return "I have AC";
    }

    public string SeatAdjust()
    {
        return "I can Adjust seat";
    }
}

विचार करें कि हमारे पास प्रत्येक कारों के लिए एक अलग वर्ग है।

public class Alto : Cars
{
    // Have all the features of Car class    
}

public class Verna : Cars
{
    // Have all the features of Car class + Car need to inherit ABS as the Braking technology feature which is not in Cars        
}

public class Cruze : Cars
{
    // Have all the features of Car class + Car need to inherit EBD as the Braking technology feature which is not in Cars        
}

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

public abstract class Brake
{
    public abstract string GetBrakeTechnology();
}

अब हम इस अमूर्त वर्ग से विरासत पाने की कोशिश कर रहे हैं और ब्रेकिंग सिस्टम का प्रकार वर्ना और क्रूज़ में लागू किया गया है:

public class Verna : Cars,Brake
{
    public override string GetBrakeTechnology()
    {
        return "I use ABS system for braking";
    }       
}

public class Cruze : Cars,Brake
{
    public override string GetBrakeTechnology()
    {
       return "I use EBD system for braking";
    }         
}

उपरोक्त दो वर्गों में समस्या देखें? वे कई वर्गों से विरासत में लेते हैं जो C # .net बच्चों में विधि लागू होने के बावजूद अनुमति नहीं देता है। यहाँ यह इंटरफ़ेस की आवश्यकता है।

interface IBrakeTechnology
{
    string GetBrakeTechnology();
}

और कार्यान्वयन नीचे दिया गया है:

public class Verna : Cars, IBrakeTechnology
{
    public string GetBrakeTechnology()
    {
        return "I use ABS system for braking";
    }
}

public class Cruze : Cars, IBrakeTechnology
{
   public string GetBrakeTechnology()
   {
       return "I use EBD system for braking";
   }        
}

अब Verna और Cruze इंटरफ़ेस की मदद से अपनी तरह की ब्रेकिंग तकनीकों के साथ कई विरासत हासिल कर सकते हैं।


4
उदाहरणों के कारण यह सबसे अच्छा स्पष्टीकरण है।
एडम मेंडोज़ा

2
यह मेरे दिमाग को रगड़े बिना समझ में आता है। मैं अपने छात्रों के लिए एक कार उदाहरण के साथ आने की कोशिश कर रहा था। इसे एक साथ रखने के लिए समय देने के लिए धन्यवाद।
ताज़बॉय

9

किसी विशेष व्यवहार को लागू करने के लिए इंटरफेस हल्के वजन का तरीका है। यह सोचने का एक तरीका है।


8

ये जवाब बहुत लंबा है।

  • व्यवहार को परिभाषित करने के लिए इंटरफेस हैं।

  • अमूर्त कक्षाएं अपने व्यवहार सहित, किसी चीज़ को स्वयं परिभाषित करने के लिए हैं। यही कारण है कि हम कभी-कभी कुछ अतिरिक्त गुणों के साथ एक सार वर्ग बनाते हैं जो एक इंटरफ़ेस विरासत में मिलता है।

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


7

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

2) आप एक संपत्ति को एक इंटरफ़ेस में परिभाषित कर सकते हैं, इसलिए उस इंटरफ़ेस को लागू करने वाले वर्ग के पास वह संपत्ति होनी चाहिए।

उदाहरण के लिए:

  public interface IVariable
  {
      string name {get; set;}
  }

वह वर्ग जो उस इंटरफ़ेस को लागू करता है, उसके पास एक संपत्ति जैसी होनी चाहिए।


7

हालांकि यह सवाल काफी पुराना है, मैं इंटरफेस के पक्ष में एक और बिंदु जोड़ना चाहूंगा:

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


1
मेरा मानना ​​है कि आपका मतलब है कि एक डीआई उपकरण एक वर्ग को इंजेक्ट कर सकता है जो एक इंटरफ़ेस को लागू करता है। कुछ ऐसे उपकरण एक अमूर्त वर्ग से प्राप्त कक्षाओं को भी इंजेक्ट कर सकते हैं, या आप कह रहे हैं कि यह असंभव है?
जॉन साउंडर्स

6

से मेरा एक और उत्तर , ज्यादातर जब एक अन्य बनाम का उपयोग करने के साथ काम:

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


6

इंटरफ़ेस प्रकार बनाम सार बेस कक्षाएं

प्रो सी # 5.0 और .NET 4.5 फ्रेमवर्क पुस्तक से अनुकूलित ।

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

public abstract class CloneableType
{
// Only derived types can support this
// "polymorphic interface." Classes in other
// hierarchies have no access to this abstract
// member.
   public abstract object Clone();
}

इस परिभाषा को देखते हुए, केवल सदस्य जो CloneableType का विस्तार करते हैं, क्लोन () विधि का समर्थन करने में सक्षम हैं। यदि आप ऐसी कक्षाओं का एक नया सेट बनाते हैं जो इस आधार वर्ग का विस्तार नहीं करते हैं, तो आप इस बहुरूपी इंटरफ़ेस को हासिल नहीं कर सकते। इसके अलावा, आप याद कर सकते हैं कि C # कक्षाओं के लिए एकाधिक उत्तराधिकार का समर्थन नहीं करता है। इसलिए, यदि आप एक मिनीवैन बनाना चाहते हैं, जो कि एक कार है और एक-क्लोंएबल टाइप है, तो आप ऐसा करने में असमर्थ हैं:

// Nope! Multiple inheritance is not possible in C#
// for classes.
public class MiniVan : Car, CloneableType
{
}

जैसा कि आप अनुमान लगाते हैं, इंटरफ़ेस प्रकार बचाव के लिए आते हैं। किसी इंटरफ़ेस को परिभाषित करने के बाद, इसे किसी भी वर्ग या संरचना द्वारा, किसी भी पदानुक्रम में, किसी भी नामस्थान या किसी असेंबली (किसी भी .NET प्रोग्रामिंग भाषा में लिखित) के द्वारा लागू किया जा सकता है। जैसा कि आप देख सकते हैं, इंटरफेस अत्यधिक बहुरूपी हैं। सिस्टम नामस्थान में परिभाषित ICloneable नाम के मानक .NET इंटरफ़ेस पर विचार करें। यह इंटरफ़ेस क्लोन नामक एकल विधि को परिभाषित करता है ():

public interface ICloneable
{
object Clone();
}

6

दूसरा सवाल का उत्तर: publicचर में परिभाषित किया गया interfaceहै static finalडिफ़ॉल्ट रूप से, जबकि publicमें चर abstractवर्ग एक उदाहरण चर रहा है।


6

यह सुनिश्चित करने के लिए कि ओओपी में इंटरफ़ेस और अमूर्त वर्ग के व्यवहार को समझना महत्वपूर्ण है (और भाषाएं उन्हें कैसे संभालती हैं), लेकिन मुझे लगता है कि यह समझना भी महत्वपूर्ण है कि वास्तव में प्रत्येक शब्द का क्या अर्थ है। क्या आप इस ifआदेश की कल्पना कर सकते हैं कि यह शब्द का अर्थ क्या है? इसके अलावा, वास्तव में कुछ भाषाएँ कम कर रही हैं, इससे भी अधिक, एक इंटरफ़ेस और एक अमूर्त के बीच के अंतर ... अगर संयोग से एक दिन दो शब्द लगभग समान रूप से संचालित होते हैं, तो कम से कम आप खुद को परिभाषित कर सकते हैं कि (और क्यों) उनमें से कोई भी होना चाहिए के लिए इस्तेमाल होता है।

यदि आप कुछ शब्दकोशों और अन्य फोंट के माध्यम से पढ़ते हैं तो आपको एक ही शब्द के लिए अलग-अलग अर्थ मिल सकते हैं लेकिन कुछ सामान्य परिभाषाएँ हैं। मुझे लगता है कि इस साइट में मुझे मिले ये दो अर्थ वास्तव में अच्छे और उपयुक्त हैं।

इंटरफेस:

एक ऐसी चीज या परिस्थिति जो अलग और कभी-कभी असंगत तत्वों को प्रभावी ढंग से समन्वयित करने में सक्षम बनाती है।

सार:

कुछ ऐसा जो अपने आप में किसी चीज के आवश्यक गुणों को अधिक व्यापक या अधिक सामान्य या कई चीजों में केंद्रित करता है; सार।

उदाहरण:

आपने एक कार खरीदी और उसे ईंधन की जरूरत है।

यहां छवि विवरण दर्ज करें

आपका कार मॉडल है XYZ, जो शैली का है ABC, इसलिए यह एक ठोस कार है, जो कार का एक विशिष्ट उदाहरण है। एक कार एक वास्तविक वस्तु नहीं है। वास्तव में, यह एक विशिष्ट वस्तु बनाने के लिए मानकों (गुणों) का एक सार सेट है। संक्षेप में, कार एक अमूर्त वर्ग है , यह "कुछ ऐसा है जो अपने आप में कुछ भी व्यापक या अधिक सामान्य के आवश्यक गुणों को केंद्रित करता है"

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

ऑब्जेक्ट ओरिएंटेड दृश्य में, शैली के लिए ईंधन ABCको एक वर्ग के रूप में घोषित नहीं किया जाना चाहिए क्योंकि वहां कार की विशिष्ट शैली के लिए कोई ठोस ईंधन नहीं है। यद्यपि आपकी कार एक अमूर्त वर्ग के ईंधन या वाहनविशिष्ट ईंधन को स्वीकार कर सकती है, आपको याद रखना चाहिए कि आपके कुछ मौजूदा वाहन ईंधन विनिर्देश को पूरा करते हैं, जो आपकी कार मैनुअल में आवश्यकताओं को लागू करते हैं। संक्षेप में, उन्हें इंटरफ़ेस लागू करना चाहिए ABCGenreFuel, जो "... प्रभावी ढंग से समन्वय करने के लिए अलग और कभी-कभी असंगत तत्वों को सक्षम करता है"

परिशिष्ट

इसके अलावा, मुझे लगता है कि आपको शब्द वर्ग के अर्थ को ध्यान में रखना चाहिए, जो कि (उसी साइट से जो पहले उल्लेख किया गया है):

वर्ग:

आम विशेषताओं, विशेषताओं, गुणों या लक्षणों के कारण समूह बनाने वाले व्यक्तियों या चीजों की संख्या; मेहरबान;

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


1
बहुत अधिक फुलाना, यह लोगों को पहले से ही हो सकता है की तुलना में अधिक भ्रमित ध्वनि मत करो।
गंजीई 19

5

कोडिंग के परिप्रेक्ष्य से

एक इंटरफ़ेस एक सार वर्ग को बदल सकता है यदि सार वर्ग में केवल सार विधियाँ हैं। अन्यथा सार वर्ग को इंटरफ़ेस में बदलने का मतलब है कि आप कोड पुन: प्रयोज्य पर खो देंगे जो कि विरासत प्रदान करता है।

डिजाइन परिप्रेक्ष्य से

इसे एक सार वर्ग के रूप में रखें यदि यह एक "एक" संबंध है और आपको एक सबसेट या सभी कार्यक्षमता की आवश्यकता है। अगर यह एक "चाहिए" संबंध है, तो इसे इंटरफ़ेस के रूप में रखें।

तय करें कि आपको क्या चाहिए: बस नीति प्रवर्तन, या कोड पुन: प्रयोज्य और नीति।


3

अन्य मतभेदों के जोड़े:

अमूर्त वर्गों में स्थिर विधियां, गुण, क्षेत्र आदि हो सकते हैं और ऑपरेटर, इंटरफेस नहीं कर सकते हैं। कास्ट ऑपरेटर अमूर्त वर्ग से / के लिए कास्टिंग की अनुमति देता है लेकिन इंटरफ़ेस से / के लिए कास्टिंग की अनुमति नहीं देता है।

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


जावा में, इंटरफ़ेस सदस्य चर हो सकता है लेकिन डिफ़ॉल्ट रूप से वे इंटरफ़ेस ..so सार्वजनिक स्थिर स्थिर क्षेत्रों में हो सकता है बन
जितेंद्र Vispute

हाँ इंटरफ़ेस में स्थिर फ़ील्ड हो सकते हैं। BUT इंटरफ़ेस में स्थिर विधियाँ नहीं हो सकती हैं।
एक शिक्षार्थी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.