2009-02-17 10 views
14

डुप्लिकेट: Interface vs Base classआप एक सार कक्षा और इंटरफ़ेस का उपयोग करने के बीच कैसे निर्णय लेते हैं?


मैं OOP, डिजाइन पैटर्न, और actionscript 3 की दुनिया में गहरी हो रही किया गया है और मैं अभी भी उत्सुक जब AS3 के लिए एक सार वर्ग (छद्म उपयोग करने के लिए पता है कि कैसे कर रहा हूँ जो सार वर्गों का समर्थन नहीं करता है) और एक इंटरफ़ेस। मेरे लिए बस दोनों टेम्पलेट्स के रूप में कार्य करते हैं जो सुनिश्चित करते हैं कि किसी दिए गए वर्ग में कुछ विधियां लागू की गई हैं। क्या अंतर पूरी तरह से इस तथ्य में है कि सार वर्गों को विरासत की आवश्यकता होती है और एक इंटरफ़ेस केवल विस्तारित होता है?

धन्यवाद, ब्रायन हॉज hodgedev.com

+0

डुप्ले: http://stackoverflow.com/questions/56867/interface-vs-base-class – juan

+1

यह थोड़ा अलग है क्योंकि यह सभी मूल वर्गों के बजाय अमूर्त आधार वर्गों का जिक्र कर रहा है। –

+0

मैं डुप्लिकेट लिंक हटा दूंगा, लेकिन मेरे पास उस स्तर का उपयोग –

उत्तर

30

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

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

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

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

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

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

+0

बहुत बहुत धन्यवाद यह बहुत उपयोगी था। –

+0

यह सीधे बिंदु पर है, मेरे ऊपर अंगूठे – JPReddy

2

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

2

@ m4bwav नोट्स के रूप में, प्राथमिक अंतर यह है कि एक अमूर्त वर्ग कम से कम कुछ विधियों के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान कर सकता है। यह आपको अमूर्त वर्ग में अमूर्त वर्ग से प्राप्त होने वाले सभी वर्गों के लिए सामान्य कोड रखने के द्वारा, अपना कोड DRY (स्वयं को दोहराएं) रखने के लिए अमूर्त वर्ग का उपयोग करने की अनुमति देता है।

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

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

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