श्रेणी और वर्ग विस्तार के बीच अंतर?


85

एक श्रेणी और एक वर्ग विस्तार के बीच अंतर क्या है। मेरा मानना ​​है कि दोनों का उपयोग मौजूदा कक्षाओं में कस्टम तरीकों को जोड़ने के लिए किया जाता है। क्या कोई इस पर प्रकाश डाल सकता है? कोड के साथ परीक्षा वास्तव में सराहना की जाएगी।



3
Akusete, पृष्ठ नहीं मिला।
आदिल हुसैन

यहां स्पष्ट रूप से चित्रित किया गया है, code.tutsplus.com/tutorials/…
grassyburrito

जवाबों:


103

एक श्रेणी मौजूदा वर्गों के तरीकों को जोड़ने का एक तरीका है। वे आमतौर पर "NSView + CustomAdditions." (और .m, बिल्कुल) की तरह "क्लास + श्रेणीनाम" नामक फाइलों में रहते हैं।

एक वर्ग विस्तार 2 मुख्य अंतरों को छोड़कर एक श्रेणी है:

  1. श्रेणी का कोई नाम नहीं है। इसे इस तरह घोषित किया जाता है:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @समाप्त
  2. एक्सटेंशन का कार्यान्वयन फ़ाइल के मुख्य @ कार्यान्वयन संस्करण में होना चाहिए।

कक्षा में अधिक विधियों की घोषणा करने वाली .m फ़ाइल के शीर्ष पर एक क्लास एक्सटेंशन देखना काफी आम है, जो तब क्लास के मुख्य @ कार्यान्वयन संस्करण में नीचे लागू किया जाता है। यह "छद्म-निजी" तरीकों को घोषित करने का एक तरीका है (छद्म-निजी जिसमें वे वास्तव में निजी नहीं हैं, केवल बाहरी रूप से उजागर नहीं हैं)।


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

जब आप उन विधियों और गुणों को वर्ग में जमा कर सकते हैं, तो क्लास एक्सटेंशन क्यों जोड़ें? मुझे थोड़ा बेमानी लगता है।
user1721803

1
@ user1721803 जैसा कि दवे ने सुझाव दिया है कि आप कुछ संपत्तियों / विधियों को अनएक्सपोज्ड रखना चाह सकते हैं। यह तब है जब एक्सटेंशन का उपयोग किया जाता है। एक दृश्य पर विचार करें, आप अपने सभी IBOutlets और IBActions को विस्तार से बढ़ा सकते हैं और उन तरीकों को उजागर कर सकते हैं जो आउटलेट्स और क्रियाओं को प्रारंभ / अपडेट करने की अनुमति देता है।
GoodSp33d

@MaxSeelemann कृपया आप एक छोटी स्क्रिप्ट द्वारा "(सार्वजनिक) रीड-ओनली प्रॉपर्टी को आंतरिक रूप से रीडराइट" बनाने के लिए डेमो कर सकते हैं? धन्यवाद।
एलनिनली

यह उत्तर "क्लास + श्रेणीनाम / स्विफ्ट" फ़ाइल में विस्तार बताता है, क्या यह सही है ??
ऋषि

47
  1. वर्ग

=> ऑब्जेक्टिव सी में, जब आप वंशानुक्रम के बिना वर्ग में कुछ अधिक कार्यक्षमता जोड़ना चाहते हैं, तो आप बस इसके लिए श्रेणी का उपयोग करते हैं।

=> यह अपनी .h और .m फ़ाइल के साथ आता है

=> Categoryनई विधि को जोड़ने के लिए उपयोग करता है गुण नहीं।

  1. क्लास एक्सटेंशन
-> 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 है

  • श्रेणी में आप वर्ग के मालिक नहीं हैं, लेकिन आप विस्तार में हैं।

5
@Prasanna: वर्ग विस्तार केवल .m फ़ाइल के साथ आता है और .h में नहीं
Saggy

1
वर्ग विस्तार केवल .h फ़ाइल के साथ आता है, न कि .m
Nishu_Priya

32
  1. श्रेणी एक वर्ग के तरीकों को जोड़ने का एक तरीका है कि क्या स्रोत कोड उपलब्ध है या नहीं, जिसका अर्थ है कि आप श्रेणी को नींव वर्गों में जोड़ सकते हैं जैसे कि NSStringऔर अपने स्वयं के कस्टम वर्गों के लिए भी।

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

  2. हम वर्ग विस्तार में अतिरिक्त उदाहरण चर और गुण जोड़ सकते हैं लेकिन श्रेणी में नहीं।

  3. एक्सटेंशन के अंदर कोई भी चर और विधि विरासत में मिली कक्षाओं के लिए भी सुलभ नहीं है।

  4. श्रेणी और विस्तार दोनों को मूल रूप से बड़े कोड बेस को संभालने के लिए बनाया गया है, लेकिन श्रेणी कई स्रोतों की फाइलों में क्लास एपीआई का विस्तार करने का एक तरीका है, जबकि विस्तार मुख्य इंटरफ़ेस फ़ाइल के बाहर आवश्यक तरीकों को जोड़ने का एक तरीका है।

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


3
मैंने कई उत्तरों के साथ 5 समान प्रश्न पढ़े, और यह सबसे अच्छा है। धन्यवाद!
हनी

1
आप श्रेणी में भी गुण जोड़ सकते हैं। देखिए @ पेबी जवाब
अतुलखत्री

7

विस्तार : तरीकों को निजी बनाने के लिए और हमारे स्वयं के कस्टम वर्ग के गुणों को जोड़ने के लिए, Apple वर्ग के नहीं।

श्रेणी : मौजूदा वर्ग में अधिक विधियों को जोड़ने के लिए संपत्ति नहीं, इसका उपयोग कस्टम वर्ग और जैसे Apple वर्ग दोनों के लिए किया जा सकता है NSString


सरल और सुरुचिपूर्ण। इसे बनाए रखें
अब्दुल यासीन

3

हम श्रेणी वर्ग में सेट संबंधित संपत्ति का उपयोग करके भी गुण रख सकते हैं।

@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/


2
@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 की घोषणा की गई


यह है कि आप घोषणा करते हैं और विस्तार करते हैं, न कि एक श्रेणी -> @interface SomeClass ()
चौविरा

0

ios एक्सटेंशन c #, java अमूर्त वर्ग या इंटरफ़ेस
ios श्रेणी के लिए जाने योग्य c #, java वर्ग एक्सटेंशन के समान है


4
आपका जवाब जैसे "बिल्ली बाघ के समान है, एक अंधे आदमी का जवाब देना"। लोल
मुरुगानंदम K

1
यह वास्तव में नहीं है। यदि आप c # या जावा जानते हैं तो यह सबसे प्रत्यक्ष और तेज़ स्पष्टीकरण है।
Add080bbA

बहुत वर्णनात्मक नहीं है, और मुश्किल से इस सवाल का जवाब दिया।
केविश जूल

0

श्रेणियाँ

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

एक्सटेंशन

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

इस लिंक पर अधिक मदद


0

यहाँ मेरी समझ है:

एक्सटेंशन का उपयोग आमतौर पर हमारे अपने " कस्टम वर्ग " में अतिरिक्त सुविधाएँ जोड़ने के लिए किया जाता है " में । हम क्लास इंटरफ़ेस के विस्तार के लिए निजी तरीकों या गुणों को जोड़ सकते हैं जिनका उपयोग क्लास के कार्यान्वयन के भीतर किया जा सकता है।

एक्सटेंशन को कक्षा के समान फ़ाइल के भीतर लिखा जाना है। इसलिए आप पूर्व निर्धारित प्रकार जैसे स्ट्रिंग, फ्लोट, आदि के लिए एक्सटेंशन नहीं लिख सकते हैं।

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

श्रेणियों को बनाते समय आपको कोष्ठक के भीतर एक नाम देना चाहिए। लेकिन विस्तार के लिए किसी नाम की आवश्यकता नहीं है। इसलिए कुछ बार उन्हें गुमनाम श्रेणियां भी कहा जाता है।


आप थोड़ा हटकर हैं।
अब्दुल यासीन

@iPhoneDeveloper हम पूर्वनिर्धारित प्रकारों के लिए एक्सटेंशन लिख सकते हैं। कृपया इस लिंक की जाँच करें - stackoverflow.com/a/33942484/2060508
yo2bh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.