NSArray के लिए एप्पल संदर्भ से, तरीके में खंड ओवरराइड:
NSArray का कोई भी उपवर्ग ओवरराइड चाहिए आदिम उदाहरण तरीकों गिनती और objectAtIndex :. इन तरीकों को बैकिंग स्टोर पर काम करना चाहिए जो आप संग्रह के तत्वों के लिए प्रदान करते हैं। इस बैकिंग स्टोर के लिए आप एक स्थिर सरणी, मानक एनएसएआरएआरई ऑब्जेक्ट, या कुछ अन्य डेटा प्रकार या तंत्र का उपयोग कर सकते हैं। आप किसी भी अन्य एनएसएआरएआर विधि के लिए आंशिक रूप से या पूरी तरह से ओवरराइड करना चुन सकते हैं जिसके लिए आप वैकल्पिक कार्यान्वयन प्रदान करना चाहते हैं।
उद्देश्य-सी में, एक साइड नोट के रूप में, कोई वास्तविक सुविधा नहीं है जो आपको क्लास को एक सार वर्ग के रूप में घोषित करने की अनुमति देती है, उदाहरण के लिए जावा में। तो, वे इसके बजाय क्या करते हैं, नीचे दिए गए कोड की तरह कुछ कॉल करते हैं, कुछ विधि के भीतर से वे उप-वर्ग द्वारा ओवरराइड होने के लिए मजबूर होना चाहते हैं। असल में, वे वर्ग 'अमूर्त वर्ग' अर्थशास्त्र देते हैं।
एक सार विधि, निम्न उत्पादन के साथ करता है, तो ओवरराइड नहीं जो एक अपवाद को जन्म देती है, के रूप में
इस विधि परिभाषा में कार्य करता है:
-someAbstractFooMethod केवल अमूर्त वर्ग के लिए परिभाषित किया। परिभाषित करें - [YourClassName someAbstractFooMethod]!
- (void) someAbstractFooMethod
{
//Force subclassers to override this method
NSString *methodName = NSStringFromSelector(_cmd);
NSString *className = [self className];
[NSException raise:NSInvalidArgumentException
format:@"-%@ only defined for abstract class. Define -[%@ %@]!", methodName, className, methodName];
}
मैं टिप्पणी करना चाहता हूं कि एक कस्टम प्रकार सुरक्षित एनएसएमयूटेबलएरे सबक्लास लागू करने का समय बर्बाद है। इस कस्टम सबक्लास को लिखने का समय खर्च करने के लिए कुछ यूनिट-टेस्ट लिखने में बेहतर खर्च होता है ताकि यह सत्यापित किया जा सके कि आपका * वास्तविक * एप्लिकेशन तर्क ध्वनि है, और इसमें अधिक अव्यवस्था नहीं है। आपका अतिरिक्त कोड बनाए रखने के लिए और अधिक कोड है, अंत उपयोगकर्ता को कोई वास्तविक लाभ जोड़ने के बिना बग और सुरक्षा त्रुटियों के लिए केवल अधिक हमले वैक्टर जोड़ना। – PeyloW
@PeyloW: एक अच्छी सैद्धांतिक स्थिति लेने के लिए, लेकिन आखिरकार असली दुनिया कोड है जहां टाइप सुरक्षा उपयोगी हो सकती है। जैसा कि मैंने लिखा पोस्ट में वर्णित है, आप उस बिंदु पर आगे की विफलता लाते हैं जहां इसे इंजेक्शन दिया गया है, कुछ मनमाने ढंग से बाद में नहीं। इससे दुर्भावनापूर्ण ऑब्जेक्ट प्रतिस्थापन की संभावना को हटाकर हमले की सतह कम हो गई। –
@PeyloW: असली दुनिया कोड भी है जिसे CoreFoundation में इंटरफ़ेस करने की आवश्यकता है। यह इस बात पर परवाह करता है कि आपका म्यूटेबल सरणी कार्यान्वयन वास्तव में एक एनएसएमयूटेबलएरे सबक्लास या कुछ और है; जिस बिंदु पर आपके कार्यान्वयन में बेहतर सबक्लास एनएसएमयूटेबलएरे था। –