दिलचस्प पोस्ट
WPF एक MenuItem.Icon कोड में सेट कैसे एमडीपीआई, एचडीपीआई, xhdpi फ़ोल्डर काम करता है? मैक ओएस एक्स 10.6 पर gnu ld कैसे स्थापित करें? किसी ऑब्जेक्ट बनाम गेटर्स को कॉल करना, इसे स्थानीय चर (मेमोरी पदचिह्न, प्रदर्शन) के रूप में संग्रहीत करना java.lang.NoClassDefFound त्रुटि: जावा मेल के लिए JUnit परीक्षण के मामले के लिए com / sun / mail / util / MailLogger क्या लूप का उपयोग करने के लिए ब्रेक का इस्तेमाल करना बुरा व्यवहार है? presentRequestsDialogModallyWithSession काम नहीं करता है, लेकिन अच्छे परिणाम देता है कैसे किया प्रतिशत, समय बीत और अनुमानित समय की प्रगति को दिखाने के लिए? जावा छवि को परिवर्तित करने के लिए BufferedImage पीटाज़ बनाम डेटाटाइम को स्थानीयकृत करना D3.behavior.zoom के लिए डबल क्लिक ज़ूम कैसे अक्षम करें? स्ट्रिंग समापन SQLite में काम नहीं करता है सीएसएस फ़ॉन्ट सीमा? मूल C ++ (C ++ \ CLI और IJW का उपयोग करके) सी # पुस्तकालय को कैसे कॉल किया जाए निश्चित लंबाई 6 तीव्र सरणी के प्रकार

अमूर्त वर्ग या इंटरफ़ेस का उपयोग कब किया जाए?

सार या इंटरफ़ेस कक्षाएं क्यों बनाई गई हैं, या हमें कब या इंटरफ़ेस क्लास का उपयोग करना चाहिए?

Solutions Collecting From Web of "अमूर्त वर्ग या इंटरफ़ेस का उपयोग कब किया जाए?"

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

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

– एडीआईटी – उल्लेख करने के लिए भूल गया, अर्विकियर ने मुझे याद दिलाया

अंत में, आप जितनी चाहें उतने इंटरफेस लागू कर सकते हैं, लेकिन केवल एक वर्ग (यह सार या नहीं हो) बढ़ाएं। चुनने से पहले इसे ध्यान में रखें

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

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

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

यह कुछ सामानों के लिए सामान्यीकृत एपीआई को परिभाषित करने के लिए समझ में आता है, जो पूरी तरह से अलग-अलग कार्यान्वयन कर सकते हैं। सार कक्षाएं उन कक्षाओं के लिए अधिक उपयोगी होती हैं जो मुख्यतः एक समान होती हैं, लेकिन कुछ सूक्ष्म अंतर हैं आप दोनों तरीकों को जोड़ सकते हैं

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

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

चलो एक उदाहरण पर विचार करें।

 public interface Friend { void hello(); } 

अब आपने एक अनुबंध परिभाषित किया है जो कहता है कि किसी भी वर्ग को लागू करने के लिए Friend को विधि के लिए परिभाषा प्रदान करने की आवश्यकता hello()

यहां एक कार्यान्वयन है:

 public class myFriend implements Friend { public void hello() println("Done"); } 

अब myFriend अनुबंध पूरा कर लिया है अब सवाल यह है कि इंटरफेस का इस्तेमाल कब किया जाए?

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

ऐसा लगता है कि शमूएल कैरिएजो ने इस सवाल का जवाब अच्छी तरह से दिया है

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

ध्यान दें कि इंटरफेस का कारण जावा के लिए विशिष्ट है।

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

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

उम्मीद है की यह मदद करेगा!