दोनों वर्ग की विरासत और इंटरफेस दोनों का अपना स्थान है। वंशानुक्रम का अर्थ है "एक" जबकि एक इंटरफ़ेस एक अनुबंध प्रदान करता है जो परिभाषित करता है कि कुछ "जैसा व्यवहार करता है"।
मैं कहूंगा कि अधिक बार इंटरफेस का उपयोग करना एक बुरा अभ्यास नहीं है। मैं वर्तमान में Bill Wagner द्वारा "प्रभावी C # - 50 आपके C # सुधारने के विशिष्ट तरीके" पढ़ रहा हूं। आइटम नंबर 22 राज्यों, और मैं बोली, "प्राथमिकता को परिभाषित करना और कार्यान्वयन को प्राथमिकता दें"।
आम तौर पर जब मैं वैचारिक रूप से संबंधित प्रकारों के बीच सामान्य व्यवहार के एक विशिष्ट कार्यान्वयन को परिभाषित करने की आवश्यकता होती है तो मैं बेस कक्षाओं का उपयोग करता हूं। अधिक बार मैं इंटरफेस का उपयोग करता हूं। वास्तव में, मैं आमतौर पर एक वर्ग के लिए एक इंटरफ़ेस को परिभाषित करने से शुरू करता हूं जब मैं एक बनाना शुरू करता हूं ... भले ही अंत में मैं इंटरफ़ेस को संकलित नहीं करता हूं, मुझे लगता है कि यह सार्वजनिक एपीआई को परिभाषित करके शुरू करने में मदद करता है। जाओ से कक्षा। अगर मुझे लगता है कि मेरे पास इंटरफ़ेस को लागू करने वाले कई वर्ग हैं, और कार्यान्वयन तर्क समान है, तो ही मैं खुद से पूछूंगा कि क्या प्रकारों के बीच एक सामान्य आधार वर्ग को लागू करने के लिए यह समझ में आएगा या नहीं।
बिल वैग्नर्स बुक के कुछ उद्धरण ...
सभी व्युत्पन्न वर्ग तुरंत उस व्यवहार को शामिल करते हैं। किसी इंटरफ़ेस में एक सदस्य जोड़ने से उस इंटरफ़ेस को लागू करने वाली सभी कक्षाएं टूट जाती हैं। उनके पास नई विधि नहीं होगी और वे अब संकलन नहीं करेंगे। प्रत्येक कार्यान्वयनकर्ता को नए सदस्य को शामिल करने के लिए उस प्रकार को अपडेट करना होगा। एक अमूर्त आधार वर्ग और एक इंटरफेस के बीच चयन करना समय के साथ अपने सार का समर्थन करने के लिए सबसे अच्छा सवाल है। इंटरफेस तय किए गए हैं: आप कार्यक्षमता के एक सेट के लिए एक अनुबंध के रूप में एक इंटरफ़ेस जारी करते हैं जो किसी भी प्रकार को लागू कर सकता है। बेस क्लास को समय के साथ बढ़ाया जा सकता है। वे एक्सटेंशन हर व्युत्पन्न वर्ग का हिस्सा बन जाते हैं। दो मॉडल कई इंटरफेस का समर्थन करते हुए कार्यान्वयन कोड का पुन: उपयोग करने के लिए मिलाया जा सकता है। " उनके पास नई विधि नहीं होगी और वे अब संकलन नहीं करेंगे। प्रत्येक कार्यान्वयनकर्ता को नए सदस्य को शामिल करने के लिए उस प्रकार को अपडेट करना होगा। एक अमूर्त आधार वर्ग और एक इंटरफेस के बीच चयन करना समय के साथ अपने सार का समर्थन करने के लिए सबसे अच्छा सवाल है। इंटरफेस तय किए गए हैं: आप कार्यक्षमता के एक सेट के लिए एक अनुबंध के रूप में एक इंटरफ़ेस जारी करते हैं जो किसी भी प्रकार को लागू कर सकता है। बेस क्लास को समय के साथ बढ़ाया जा सकता है। वे एक्सटेंशन हर व्युत्पन्न वर्ग का हिस्सा बन जाते हैं। दो मॉडल कई इंटरफेस का समर्थन करते हुए कार्यान्वयन कोड का पुन: उपयोग करने के लिए मिलाया जा सकता है। " उनके पास नई विधि नहीं होगी और वे अब संकलन नहीं करेंगे। प्रत्येक कार्यान्वयनकर्ता को नए सदस्य को शामिल करने के लिए उस प्रकार को अपडेट करना होगा। एक अमूर्त आधार वर्ग और एक इंटरफेस के बीच चयन करना समय के साथ अपने सार का समर्थन करने के लिए सबसे अच्छा सवाल है। इंटरफेस तय किए गए हैं: आप कार्यक्षमता के एक सेट के लिए एक अनुबंध के रूप में एक इंटरफ़ेस जारी करते हैं जो किसी भी प्रकार को लागू कर सकता है। बेस क्लास को समय के साथ बढ़ाया जा सकता है। वे एक्सटेंशन हर व्युत्पन्न वर्ग का हिस्सा बन जाते हैं। दो मॉडल कई इंटरफेस का समर्थन करते हुए कार्यान्वयन कोड का पुन: उपयोग करने के लिए मिलाया जा सकता है। " आप कार्यक्षमता के एक सेट के लिए एक अनुबंध के रूप में एक इंटरफ़ेस जारी करते हैं जिसे कोई भी प्रकार लागू कर सकता है। बेस क्लास को समय के साथ बढ़ाया जा सकता है। वे एक्सटेंशन हर व्युत्पन्न वर्ग का हिस्सा बन जाते हैं। दो मॉडल कई इंटरफेस का समर्थन करते हुए कार्यान्वयन कोड का पुन: उपयोग करने के लिए मिलाया जा सकता है। " आप कार्यक्षमता के एक सेट के लिए एक अनुबंध के रूप में एक इंटरफ़ेस जारी करते हैं जिसे कोई भी प्रकार लागू कर सकता है। बेस क्लास को समय के साथ बढ़ाया जा सकता है। वे एक्सटेंशन हर व्युत्पन्न वर्ग का हिस्सा बन जाते हैं। कई इंटरफेस का समर्थन करते हुए कार्यान्वयन कोड का पुन: उपयोग करने के लिए दोनों मॉडलों को मिलाया जा सकता है। "
"कोडिंग इंटरफेस अन्य डेवलपर्स को बेस क्लास प्रकारों की कोडिंग की तुलना में अधिक लचीलापन प्रदान करता है।"
"एक वर्ग के लिए एपीआई को परिभाषित करने के लिए इंटरफेस का उपयोग करना अधिक लचीलापन प्रदान करता है।"
"जब आपका प्रकार वर्ग के प्रकारों के रूप में गुणों को उजागर करता है, तो यह उस वर्ग के लिए संपूर्ण इंटरफ़ेस को उजागर करता है। इंटरफेस का उपयोग करके, आप केवल उन विधियों और गुणों को उजागर करना चुन सकते हैं जिन्हें आप उपयोग करना चाहते हैं।"
"बेस क्लास संबंधित ठोस प्रकारों में सामान्य व्यवहारों का वर्णन करते हैं और उन्हें लागू करते हैं। इंटरफेस कार्यक्षमता के परमाणु टुकड़ों का वर्णन करते हैं जो असंबंधित कंक्रीट प्रकारों को लागू कर सकते हैं। दोनों का अपना स्थान है। कक्षाएं आपके द्वारा बनाए गए प्रकारों को परिभाषित करती हैं। इंटरफेस उन प्रकारों के व्यवहार को कार्यक्षमता के टुकड़ों के रूप में वर्णित करते हैं। यदि आप मतभेदों को समझते हैं, तो आप अधिक अभिव्यंजक डिजाइन बनाएंगे जो परिवर्तन के चेहरे पर अधिक लचीला हो। संबंधित प्रकारों को परिभाषित करने के लिए वर्ग पदानुक्रमों का उपयोग करें। उन प्रकारों में लागू किए गए इंटरफेस का उपयोग करके कार्यक्षमता का पर्दाफाश करें। "