दिलचस्प पोस्ट
क्या Android के भीतर सफारी के लिए जावास्क्रिप्ट त्रुटि / डीबग कंसोल को सक्षम करने का कोई तरीका है? विभिन्न पृष्ठभूमि एंड्रॉइड कार्यों के लिए एक इंटरफ़ेस का उपयोग कैसे किया जा सकता है? \ R & \ n को <br/> के साथ कैसे बदलें? ऑनक्लिक के साथ PHP फ़ंक्शन निष्पादित करें मैं गिट के लिए सब्लाइम टेक्स्ट को डिफ़ॉल्ट संपादक कैसे बना सकता हूं? जावास्क्रिप्ट के साथ ब्राउज़र में एंड्रॉइड फोन के रोटेशन का पता लगाएं हेक्सागोन का उत्तरदायी ग्रिड टिल्ड विस्तार बश में काम नहीं कर रहा है अजगर से एक प्रोग्राम चलाएं, और इसे स्क्रिप्ट के बाद मारना जारी रखना है 2 की पिछली शक्ति Windows वर्कफ़्लो फाउंडेशन का उपयोग कब करना है? जावास्क्रिप्ट फंक्शन और फॉर्म का नाम संघर्ष हेक्स को एक बाइट सरणी में कनवर्ट कैसे करें? AsNoTracking () के लिए वैश्विक सेटिंग? एकल विधि के साथ कक्षा – सर्वोत्तम दृष्टिकोण?

सार वर्ग बनाम इंटरफेस

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

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

Solutions Collecting From Web of "सार वर्ग बनाम इंटरफेस"

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

इस CodeProject आलेख में तालिका के प्रत्येक के बीच अंतर पर बहुत सारी जानकारी होती है, जिसमें प्रत्येक की सुविधाओं की तुलना करने और उनको अलग करना शामिल होता है

इंटरफेस कक्षाओं के बीच अनुबंध को परिभाषित करता है – तरीके कक्षाएं एक-दूसरे को कॉल करते हैं एक क्लास कई इंटरफेस लागू कर सकता है, लेकिन केवल एक सार क्लास से ही प्राप्त कर सकता है।

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

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

अपने पहले प्रश्न के लिए, हाँ

अपने दूसरे उत्तर के लिए मैं आपको कुछ सुझाव दिए हैं जो मैंने अपनाए हैं I

  • अपने डिजाइन ट्रेड-ऑफ को अनुकूलित करने के लिए मिश्रित कक्षाओं और इंटरफेस का उपयोग करें।

एक सार वर्ग का उपयोग करें

  • क्लास लायब्रेरी बनाते समय व्यापक रूप से वितरित या पुन: उपयोग किया जायेगा-विशेष रूप से ग्राहकों के लिए, एक इंटरफ़ेस में प्राथमिकता में एक सार वर्ग का उपयोग करें; क्योंकि, यह संस्करण को सरल करता है

  • किसी प्रकार के परिवार के लिए एक सामान्य आधार वर्ग को परिभाषित करने के लिए एक सार वर्ग का उपयोग करें

  • डिफ़ॉल्ट व्यवहार प्रदान करने के लिए एक अमूर्त वर्ग का उपयोग करें

  • उप-श्रेणी केवल उन्मुख श्रेणी में एक आधार वर्ग है जिसमें क्लास तार्किक रूप से संबंधित होता है।

एक इंटरफ़ेस का उपयोग करें

  • जब एक स्टैंडअलोन प्रोजेक्ट तैयार किया जा सकता है जो इच्छा पर बदला जा सकता है, तो एक इंटरफ़ेस का उपयोग एक सार वर्ग के लिए करें; क्योंकि, यह अधिक डिजाइन लचीलापन प्रदान करता है

  • उप-क्लासिंग के बिना बहुविवाह व्यवहार को लागू करने और कई विरासत को मॉडल बनाने के लिए इंटरफेस का उपयोग करें- कई प्रकार के व्यवहारों को समर्थन देने के लिए एक विशिष्ट प्रकार की अनुमति दें

  • मूल्य प्रकारों के लिए एक बहुउद्देशीय पदानुक्रम डिजाइन करने के लिए एक इंटरफ़ेस का उपयोग करें

  • एक अंतरफलक का उपयोग करें जब एक अपरिवर्तनीय अनुबंध वास्तव में इरादा है

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

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

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

यदि आप केवल अमूर्त वर्गों का उपयोग करते हैं, तो आपकी कक्षा अन्य कक्षाओं से वंशानुक्रम नहीं कर सकती क्योंकि C # एकाधिक विरासत का समर्थन नहीं करता है। यदि आप केवल इंटरफेस का उपयोग करते हैं, तो आपकी कक्षाएं आम कोड साझा नहीं कर सकतीं

 public interface IFoo { void Bar(); } public abstract class FooBase : IFoo { public abstract void Bar() { // Do some stuff usually required for IFoo. } } 

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

 public class FooOne : FooBase { public override void Bar() { base.Bar(); // Use base implementation. // Do specialized stuff. } } public class FooTwo : FooBase { public override void Bar() { // Do other specialized stuff. base.Bar(); // Use base implementation. // Do more specialized stuff. } } // This class cannot use the base implementation from FooBase because // of inheriting from OtherClass but it can still implement IFoo. public class FooThree : OtherClass, IFoo { public virtual void Bar() { // Do stuff. } } 

यदि आपके पास कोई भी डिफ़ॉल्ट / सामान्य कोड नहीं है, तो एक अंतरफलक के साथ जाएं।

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

 public abstract class Processor { // this is the only public method // implements the order of the separate steps public void Process() { Step1(); Step2(); //... } // implementation is provided by derived classes protected abstract void Step1(); protected abstract void Step2(); } 

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

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

अमूर्त वर्ग, टेम्पलेटले व्यवहार के साथ अधिक हैं, जहां आभासी विधियां 'अंतराल को भरने' का स्थान हैं। जाहिर है आप अमूर्त वर्गों को कम नहीं कर सकते (कम से कम, सी में नहीं)

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

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

दूसरों को अपना जवाब तेजी से लिखना लगता है, लेकिन मुझे संक्षेप करने की अनुमति है …

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

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

मॉडलिंग है जब मैं पालन नियम: कक्षा (सार शामिल) और structs मॉडल संस्थाओं। मॉडल व्यवहार interfaces एक इंटरफ़ेस को लागू करने वाली संस्थाओं को प्रदर्शित करने वाले व्यवहारों के रूप में माना जा सकता है कि इंटरफ़ेस (अनुबंध) उजागर करता है।

इसका उत्तर में कुछ जवाबों पर संकेत दिया गया है लेकिन स्पष्ट रूप से नहीं कहा गया है।

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

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

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

आपको कंक्रीट वर्गों की तुलना में इंटरफेस के लिए हमेशा प्रोग्रामिंग करना चाहिए।

यदि आप भी एक डिफ़ॉल्ट कार्यान्वयन करना चाहते हैं तो आप अभी भी एक बेस क्लास बना सकते हैं जो आपके इंटरफेस (एस) को लागू करता है