objective c - उद्देश्य-सी में श्रेणियों का उपयोग कर विधियों को ओवरराइड करना




objective-c categories (3)

क्या मैं किसी श्रेणी का उपयोग करके पहले से लागू की गई विधि को ओवरराइड करने के लिए कक्षा श्रेणी का उपयोग कर सकता हूं? इस कदर:

1) मूल विधि

-(BOOL) method {
  return true;
}

2) ओवरराइड विधि

-(BOOL) method {
  NSLog(@"error?"); 
  return true; 
}

क्या यह काम करेगा, या यह अवैध है?



पुराना दस्तावेज लिंक मर चुका है; सबसे अच्छा प्रतिस्थापन मुझे मिल सकता था: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… :

श्रेणी विधि नाम संघर्ष से बचें

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

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

यह एक हल्का स्पर्श का उपयोग कर ऐप्पल है, लेकिन मुख्य बिंदु एक जैसा है: आप आपदा को आमंत्रित करते हैं, क्योंकि अप्रत्याशित व्यवहार चुप है।


ऐप्पल दस्तावेज से :

यद्यपि उद्देश्य-सी भाषा वर्तमान में कक्षा को विरासत में प्राप्त विधियों को ओवरराइड करने के लिए एक श्रेणी का उपयोग करने की अनुमति देती है, या यहां तक ​​कि कक्षा इंटरफ़ेस में घोषित विधियों को भी, आप ऐसा करने से दृढ़ता से निराश हैं । एक श्रेणी उप-वर्ग के लिए एक विकल्प नहीं है। तरीकों को ओवरराइड करने के लिए श्रेणी का उपयोग करने के लिए कई महत्वपूर्ण कमीएं हैं:

  • जब कोई श्रेणी विरासत विधि को ओवरराइड करती है, तो श्रेणी में विधि सामान्य रूप से, एक संदेश के माध्यम से विरासत में कार्यान्वित किया जा सकता है। हालांकि, यदि कोई श्रेणी श्रेणी की कक्षा में मौजूद किसी विधि को ओवरराइड करता है , तो मूल कार्यान्वयन का आह्वान करने का कोई तरीका नहीं है

  • एक श्रेणी समान वर्ग की किसी अन्य श्रेणी में घोषित विधियों को विश्वसनीय रूप से ओवरराइड नहीं कर सकती है।

    यह मुद्दा विशेष महत्व का है क्योंकि कई कोको कक्षाएं श्रेणियों का उपयोग करके लागू की जाती हैं। एक ढांचा-परिभाषित विधि जिसे आप ओवरराइड करने का प्रयास करते हैं, स्वयं को एक श्रेणी में लागू किया जा सकता है, और इसलिए कार्यान्वयन को प्राथमिकता दी जाती है।

  • कुछ श्रेणी विधियों की उपस्थिति से सभी ढांचे में व्यवहार में परिवर्तन हो सकता है। उदाहरण के लिए, यदि आप windowWillClose: ओवरराइड करते हैं windowWillClose: NSObject पर एक श्रेणी में प्रतिनिधि विधि, आपके प्रोग्राम में सभी विंडो प्रतिनिधि तब श्रेणी विधि का उपयोग करके प्रतिक्रिया देते हैं; NSWindow के आपके सभी उदाहरणों का व्यवहार बदल सकता है। एक फ्रेमवर्क कक्षा में जो श्रेणियां आप जोड़ते हैं वे व्यवहार में रहस्यमय परिवर्तन कर सकते हैं और दुर्घटनाओं का कारण बन सकते हैं।





categories