एक श्रेणी और एक वर्ग विस्तार के बीच अंतर क्या है। मेरा मानना है कि दोनों का उपयोग मौजूदा कक्षाओं में कस्टम तरीकों को जोड़ने के लिए किया जाता है। क्या कोई इस पर प्रकाश डाल सकता है? कोड के साथ परीक्षा वास्तव में सराहना की जाएगी।
एक श्रेणी और एक वर्ग विस्तार के बीच अंतर क्या है। मेरा मानना है कि दोनों का उपयोग मौजूदा कक्षाओं में कस्टम तरीकों को जोड़ने के लिए किया जाता है। क्या कोई इस पर प्रकाश डाल सकता है? कोड के साथ परीक्षा वास्तव में सराहना की जाएगी।
जवाबों:
एक श्रेणी मौजूदा वर्गों के तरीकों को जोड़ने का एक तरीका है। वे आमतौर पर "NSView + CustomAdditions." (और .m, बिल्कुल) की तरह "क्लास + श्रेणीनाम" नामक फाइलों में रहते हैं।
एक वर्ग विस्तार 2 मुख्य अंतरों को छोड़कर एक श्रेणी है:
श्रेणी का कोई नाम नहीं है। इसे इस तरह घोषित किया जाता है:
@interface SomeClass ()
- (void) anAdditionalMethod;
@समाप्तएक्सटेंशन का कार्यान्वयन फ़ाइल के मुख्य @ कार्यान्वयन संस्करण में होना चाहिए।
कक्षा में अधिक विधियों की घोषणा करने वाली .m फ़ाइल के शीर्ष पर एक क्लास एक्सटेंशन देखना काफी आम है, जो तब क्लास के मुख्य @ कार्यान्वयन संस्करण में नीचे लागू किया जाता है। यह "छद्म-निजी" तरीकों को घोषित करने का एक तरीका है (छद्म-निजी जिसमें वे वास्तव में निजी नहीं हैं, केवल बाहरी रूप से उजागर नहीं हैं)।
=> ऑब्जेक्टिव सी में, जब आप वंशानुक्रम के बिना वर्ग में कुछ अधिक कार्यक्षमता जोड़ना चाहते हैं, तो आप बस इसके लिए श्रेणी का उपयोग करते हैं।
=> यह अपनी .h और .m फ़ाइल के साथ आता है
=> Categoryनई विधि को जोड़ने के लिए उपयोग करता है गुण नहीं।
-> In Objective C, when you want to make behaviour of some property private you use class extension.
-> it comes with **.h** file only.
-> mainly for properties.
नोट: जब हम एक नई फ़ाइल जोड़ते हैं और वस्तुनिष्ठ श्रेणी का एक विकल्प चुनते हैं तो श्रेणी और श्रेणी "" नहीं "उपवर्ग" का चयन करता है, इसलिए यह दिखाता है कि "
@interface className (categoryName)
@end
-आपको दो फ़ाइल .h और .m फ़ाइल नाम के साथ मिलेंगे ( className + categoryName.h और className + categoryName.m )
और विस्तार के मामले में आपको मिलेगा
@interface className()
@end
-आपको केवल एक फाइल मिलेगी जिसका नाम className_extensionName.h है
श्रेणी एक वर्ग के तरीकों को जोड़ने का एक तरीका है कि क्या स्रोत कोड उपलब्ध है या नहीं, जिसका अर्थ है कि आप श्रेणी को नींव वर्गों में जोड़ सकते हैं जैसे कि NSStringऔर अपने स्वयं के कस्टम वर्गों के लिए भी।
एक्सटेंशन को केवल उन्हीं वर्गों में जोड़ा जा सकता है जिनका सोर्स कोड उपलब्ध है क्योंकि कंपाइलर उसी समय सोर्स कोड और एक्सटेंशन को संकलित करता है।
हम वर्ग विस्तार में अतिरिक्त उदाहरण चर और गुण जोड़ सकते हैं लेकिन श्रेणी में नहीं।
एक्सटेंशन के अंदर कोई भी चर और विधि विरासत में मिली कक्षाओं के लिए भी सुलभ नहीं है।
श्रेणी और विस्तार दोनों को मूल रूप से बड़े कोड बेस को संभालने के लिए बनाया गया है, लेकिन श्रेणी कई स्रोतों की फाइलों में क्लास एपीआई का विस्तार करने का एक तरीका है, जबकि विस्तार मुख्य इंटरफ़ेस फ़ाइल के बाहर आवश्यक तरीकों को जोड़ने का एक तरीका है।
श्रेणी का उपयोग तब करें जब आपको अलग-अलग कार्यात्मकताओं के अनुसार अपने समान वर्ग कोड को अलग-अलग स्रोत फ़ाइलों में तोड़ना पड़े, और जब आपको मुख्य इंटरफ़ेस फ़ाइल के बाहर मौजूदा वर्ग में कुछ आवश्यक तरीकों को जोड़ने की आवश्यकता हो, तो विस्तार करें। इसके अलावा, जब आपको किसी कक्षा में सार्वजनिक रूप से घोषित उदाहरण चर को संशोधित करने की आवश्यकता होती है, उदाहरण के लिए, आसानी से पढ़ने के लिए, तो आप इसे विस्तार से फिर से घोषित कर सकते हैं।
विस्तार : तरीकों को निजी बनाने के लिए और हमारे स्वयं के कस्टम वर्ग के गुणों को जोड़ने के लिए, Apple वर्ग के नहीं।
श्रेणी : मौजूदा वर्ग में अधिक विधियों को जोड़ने के लिए संपत्ति नहीं, इसका उपयोग कस्टम वर्ग और जैसे Apple वर्ग दोनों के लिए किया जा सकता है NSString।
हम श्रेणी वर्ग में सेट संबंधित संपत्ति का उपयोग करके भी गुण रख सकते हैं।
@interface SomeClass (Private)
@property (nonatomic, assign) id newProperty;
@end
NSString * const kNewPropertyKey = @"kNewPropertyKey";
@implementation SomeClass (Private)
@dynamic newProperty;
- (void)setNewProperty:(id)aObject
{
objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}
- (id)newProperty
{
return objc_getAssociatedObject(self, kNewPropertyKey);
}
@end
देखें: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
@interface SomeClass ()
- (void) anAdditionalMethod;
@end
मुझे लगता है कि यह श्रेणी घोषित करने का तरीका नहीं है। श्रेणी में एक नाम होना चाहिए
@interface SomeClass (XYZ)
- (void) anAdditionalMethod;
@end
उदाहरण के लिए
@interface NSMutableArray (NSMutableArrayCreation)
+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;
@end
Apple द्वारा NSMutableArray की घोषणा की गई
ios एक्सटेंशन c #, java अमूर्त वर्ग या इंटरफ़ेस
ios श्रेणी के लिए जाने योग्य c #, java वर्ग एक्सटेंशन के समान है
श्रेणियाँ
श्रेणियों का उपयोग तब किया जाता है जब आप बड़ी संख्या में विधियाँ युक्त फ़ाइल बना रहे होते हैं। यदि वे आपको एकल मॉड्यूल को अलग-अलग मॉड्यूल में विभाजित करने की सुविधा प्रदान करते हैं। इसके अलावा यदि कंपाइलरों की श्रेणियों में कोई बदलाव किया जाता है, तो पूरी परियोजना को संकलित करने में समय बर्बाद नहीं होता है। .श्रेणीएँ नए चर या गुणों को जोड़ने और उनके मूल वर्ग को देखने में सक्षम नहीं हैं। आप किसी श्रेणी में एक विधि को ओवरराइड कर सकते हैं, लेकिन यह एक अच्छा विचार नहीं है क्योंकि यह विधि आगे नहीं जा सकती है। इसके अलावा प्रवाह को प्रभावित किया जा सकता है क्योंकि इन श्रेणियों में है समान श्रेणीबद्ध स्तर और इसलिए एक ही मूल वर्ग से संबंधित दो श्रेणियां रन टाइम पर मौजूद हो सकती हैं। श्रेणियों का उपयोग करके संरक्षित तरीके बनाए जा सकते हैं
एक्सटेंशन
एक्सटेंशन आपको संपत्ति को ओवरराइड करने या मौजूदा मूल वर्ग में नई संपत्ति जोड़ने में सक्षम करते हैं। आमतौर पर उन श्रेणियों के लिए जिनका नाम नहीं है और उन्हें @interface वर्ग () के रूप में दर्शाया गया है। कोई फ़ाइल मौजूद नहीं है और विस्तार से घोषित विधि को लागू किया जाना है। @ मूल फ़ाइल का कार्यान्वयन
इस लिंक पर अधिक मदद
यहाँ मेरी समझ है:
एक्सटेंशन का उपयोग आमतौर पर हमारे अपने " कस्टम वर्ग " में अतिरिक्त सुविधाएँ जोड़ने के लिए किया जाता है " में । हम क्लास इंटरफ़ेस के विस्तार के लिए निजी तरीकों या गुणों को जोड़ सकते हैं जिनका उपयोग क्लास के कार्यान्वयन के भीतर किया जा सकता है।
एक्सटेंशन को कक्षा के समान फ़ाइल के भीतर लिखा जाना है। इसलिए आप पूर्व निर्धारित प्रकार जैसे स्ट्रिंग, फ्लोट, आदि के लिए एक्सटेंशन नहीं लिख सकते हैं।
दूसरी ओर, श्रेणियों का उपयोग पूर्व मौजूदा कक्षाओं में अतिरिक्त तरीकों को जोड़ने के लिए किया जा सकता है। उदाहरण हम स्ट्रिंग कक्षा का विस्तार करके अपने तरीके बना सकते हैं। ध्यान दें कि हम श्रेणियों में अतिरिक्त गुण नहीं बना सकते हैं । श्रेणियों का मुख्य लाभ यह है कि हम उस फ़ाइल के बाहर किसी अन्य फ़ाइल में श्रेणियां लिख सकते हैं, जहाँ आपकी कक्षा बाहर निकलती है।
श्रेणियों को बनाते समय आपको कोष्ठक के भीतर एक नाम देना चाहिए। लेकिन विस्तार के लिए किसी नाम की आवश्यकता नहीं है। इसलिए कुछ बार उन्हें गुमनाम श्रेणियां भी कहा जाता है।