दिलचस्प पोस्ट
ब्लूटूथ कनेक्शन विफल "java.io.IOException: पढ़ने में असफल, सॉकेट बंद हो सकता है या टाइमआउट, रीड पढ़ें: -1" बावर्ची व्यंजनों में समय बनाम चलाने का समय संकलित करें Parfor का उपयोग कर समय और स्मृति की बचत? क्यों मेरे सी # आवेदन में मेमोरी अपवाद का एक आउट हो रहा है? JavaFX में सीएसएस के साथ एनीमेशन कैसे बनाऊं? कैसे Jquery- चयन 2 में बहु-मान चयन में चयनित मूल्य को सेट करें।? HTML5 के साथ ऑडियो कैप्चरिंग Android MediaCodec के साथ कैमरे से एन्कोडिंग एच .264 फ़ंक्शन पॉइंटर को अन्य प्रकार से कास्ट करना सी # SQL सर्वर डेटाटाइव के समतुल्य फायरबेज क्वेरी अगर बच्चे के बच्चे में मूल्य शामिल है OnNavigationItem साथ टुकड़ों के बीच स्विच करें नए नेविगेशन दराज गतिविधि टेम्पलेट में चयनित (एंड्रॉइड स्टूडियो 1.4 आगे) एंड्रॉइड: गैलरी से छवि का चयन करें, फिर फसल करें और छवि दृश्य में दिखाएं मैं जावास्क्रिप्ट (jquery) के साथ एक मान को एक स्ट्रिंग लौटने वाले एक पूर्णांक मान कैसे जोड़ूं? UIImage से हैश उत्पन्न करें

उद्देश्य-सी में विरासत और श्रेणियों के बीच अंतर क्या है

क्या कोई मुझे उद्देश्य सी में श्रेणियों और विरासत के बीच का अंतर बता सकता है? मैंने विकिपीडिया में प्रविष्टि पढ़ ली है और श्रेणियों पर चर्चा विरासत के अनुसार अलग नहीं दिखती है मैंने "ओपन आईफ़ोन डेवलपमेंट" पुस्तक में विषय पर चर्चा की और मैंने अभी भी इसे नहीं प्राप्त किया।

Solutions Collecting From Web of "उद्देश्य-सी में विरासत और श्रेणियों के बीच अंतर क्या है"

कभी-कभी, विरासत की तुलना में अधिक परेशानी की तरह लगता है यह सही ढंग से प्रयोग किया जाता है जब आप किसी मौजूदा वर्ग में कुछ जोड़ना चाहते हैं जो कि कक्षा के व्यवहार में बदलाव है।

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

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

श्रेणियाँ कार्यप्रणाली जोड़ने का एक अच्छा तरीका है, जबकि एक ही समय में ऑब्जेक्ट ओरिएंटेड सिद्धांत के अनुरूप होने के लिए विरासत पर संरचना पसंद करते हैं।

जनवरी 2012 को संपादित करें

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

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

यह कैसे उपयोगी हो, यह देखने के लिए: कोकोएवव देखें

उद्देश्य- c श्रेणियों की पसंदीदा चित्रों में से एक है NSString। NSString को फाउंडेशन ढांचे में परिभाषित किया गया है, जिसमें विचारों या खिड़कियों की कोई धारणा नहीं है। हालांकि, यदि आप कोको एप्लिकेशन में एक NSString का उपयोग करते हैं तो आप देखेंगे कि यह संदेश – drawInRect:withAttributes: जवाब देता है।

AppKit NSString के लिए एक श्रेणी परिभाषित करता है जो अतिरिक्त ड्राइंग विधि प्रदान करता है। श्रेणी मौजूदा विधियों में नए तरीकों को शामिल करने की अनुमति देता है, इसलिए हम अभी भी NSStrings के साथ काम कर रहे हैं। अगर ऐपकेट ने उप-क्लासिंग के आरेख को लागू किया है, तो हमें 'एपकिट्सट्रिंग' या 'एनएसएस ड्रॉवेबल स्ट्रिंग्स' से निपटना होगा या ऐसा कुछ।

श्रेणियाँ आपको मौजूदा कक्षाओं के लिए आवेदन या डोमेन विशिष्ट विधियां जोड़ते हैं। यह काफी शक्तिशाली और सुविधाजनक हो सकता है

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

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

फिर एक वर्ग के लिए एक नई कार्यक्षमता की आवश्यकता है ताकि आप कुछ चीजें कर सकें:

  1. स्टॉक वर्ग के बजाय एक नया वर्ग पूर्ण बनाएं – अपने सभी कार्यों और सदस्यों की प्रतिकृतियां फिर नए वर्ग का उपयोग करने के लिए सभी कोड को फिर से लिखना।

  2. एक नया आवरण वर्ग बनाओ जिसमें एक सदस्य (कम्पोजिटिंग) के रूप में स्टॉक क्लास होता है और नए वर्ग का उपयोग करने के लिए कोडबेस को दोबारा लिखता है।

  3. पुस्तकालय के द्विआधारी पैच कोड को बदलने के लिए (अच्छे भाग्य)

  4. कम्पाइलर को अपनी नई कक्षा को पुराने के तौर पर देखने के लिए मजबूर करें और आशा करें कि यह किसी निश्चित आकार या स्मृति और विशिष्ट प्रविष्टि बिंदुओं पर निर्भर नहीं करता है।

  5. उप-क्लास स्पेशलाइजेशन – इसके बजाय उपवर्ग का इस्तेमाल करने के लिए कार्यक्षमता जोड़ने के लिए उपवर्ग बनाने के लिए उपवर्ग बनाएं और सैद्धांतिक रूप से कुछ समस्याएं होनी चाहिए और यदि आपको डेटा सदस्यों को जोड़ने की आवश्यकता है तो यह आवश्यक है, लेकिन स्मृति पदचिह्न अलग होगा। उप कोड में उपलब्ध नए कोड और पुरानी कोड दोनों का लाभ उठाने के लिए आपको इसका लाभ मिलता है और इसका उपयोग करना है, बेस क्लास विधि या ओवरराइड पद्धति का चयन करना।

  6. आवश्यक वर्ग को परिभाषित करने के लिए आवश्यक ओबीसीसी क्लास को संशोधित करें, जो कि आप चाहते हैं और / या शेयर वर्गों में पुराने तरीकों को ओवरराइड करने के तरीकों को शामिल करते हैं।

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

    एक उदाहरण:

    आपके पास एक क्लास बिंग है जो टर्मिनल के लिए आउटपुट करता है, लेकिन सीरियल पोर्ट के लिए नहीं, और अब यह आपके लिए क्या है (किसी कारण के लिए)। आपके पास Bing.h और libBing.so, लेकिन आपकी किट में Bing.m नहीं है

    बिंग क्लास आंतरिक रूप से सभी तरह की चीज़ें करता है, आपको यह भी पता नहीं है कि आपके पास हेडर में सार्वजनिक एपीआई है।

    आप स्मार्ट हैं, इसलिए आप बिंग कक्षा के लिए एक (सीरियलऑप्टपुट) श्रेणी बनाते हैं।

     [Bing_SerialOutput.m] @interface Bing (SerialOutput) // a category - (void)ToSerial: (SerialPort*) port ; @end @implementation Bing (SerialOutput) - (void)ToSerial: (SerialPort*) port { ... /// serial output code /// } @end 

    कंपाइलर एक वस्तु बनाने के लिए बाध्य करता है जिसे आपके ऐप के साथ जोड़ा जा सकता है और रनटाइम अब जानती है कि बिंग @selector (ToSerial 🙂 का जवाब देती है और आप इसका उपयोग कर सकते हैं जैसे कि बिंग क्लास उस विधि से बनाया गया था आप केवल डेटा सदस्यों को विधियों में जोड़ नहीं सकते हैं और यह आधार वर्गों से जुड़ी कोड के विशाल ट्यूमर बनाने का इरादा नहीं था, लेकिन इसके कड़ाई से टाइप किए गए भाषाओं के साथ इसके फायदे हैं

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

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

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

-> आप उदाहरण चर को कक्षा में जोड़ नहीं सकते।
-> यदि आप क्लास के मौजूदा तरीकों को ओवरराइड करते हैं, तो आपका ऐप अप्रत्याशित रूप से व्यवहार कर सकता है।

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

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

यहाँ किसी और के रूप में इसे डाल दिया … यदि आप NSString के लिए एक नई विधि जोड़ने के लिए विरासत का उपयोग कर रहे हैं, आपको जाना होगा और उस प्रकार को बदलना होगा जिसे आप इस अन्य विधि में उपयोग कर रहे हैं, जहां आप इस नई विधि का उपयोग करना चाहते हैं। यदि, हालांकि, आप श्रेणियों का उपयोग करते हैं, तो आप उप-क्लासिंग के बिना मौजूदा NSString प्रकारों पर विधि को कॉल कर सकते हैं।

उसी छोर को या तो साथ हासिल किया जा सकता है, लेकिन श्रेणियां हमें एक ऐसा विकल्प देते हैं जो सरल होता है और कम रखरखाव की आवश्यकता होती है (शायद)

किसी को भी पता है कि ऐसी परिस्थितियां हैं जहां श्रेणियां बिल्कुल आवश्यक हैं?

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

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

  @interface UITextField(setText) - (NSString *)replaceEscape; @end @implementation UITextField(setText) - (NSString *)replaceEscape { self.text=[self.text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; return self.text; } @end 

— यह आपके सभी सफेद रिक्त स्थान से बचने के लिए टेक्स्टफ़ील्ड में एक नई संपत्ति जोड़ देगा। जिस तरह से पूरी तरह से अपना रास्ता बदलने के बिना इसे एक नया आयाम जोड़ने की तरह।