2012-03-12 7 views
7

मैं .m फ़ाइल में किसी श्रेणी के लिए एक निजी @interface घोषित करने का प्रयास कर रहा हूं।क्या किसी श्रेणी के लिए दूसरा @ इंटरफेस घोषित करना संभव है?

एक सामान्य वर्ग के लिए मुझे क्या करना होगा:

@interface ClassA() 

@end 

@implementation ClassA 

@end 

और इसे सुचारू रूप से काम करेगा।

एक वर्ग के लिए श्रेणियों के साथ मैंने कोशिश की:

@interface ClassA (CategoryA)() 

@end 

@implementation ClassA (CategoryA) 

@end 

लेकिन यह अलग त्रुटियों के सभी प्रकार दे रहा है। मैं एक श्रेणी "विस्तार" करने की कोशिश कर रहा हूं, जिस तरह से इस वर्ग को इस वाक्यविन्यास @interface ClassA() के माध्यम से बढ़ाया गया है।

मैं श्रेणी के लिए निजी विधियां लेना चाहता हूं, और मैं जानना चाहता हूं कि, खुला इंटरफ़ेस में जोड़ने के लिए मुझे .m फ़ाइल में दूसरी श्रेणी @interface डालने की अनुमति है, जो इंस्टेंस चर और विधियों का पर्दाफाश नहीं करता है कक्षा के बाहर ही।

कुछ इस तरह:

ClassA + categoryA.h

@interface ClassA (CategoryA) 

<some public methods> 

@end 

ClassA + categoryA.m फ़ाइल

@interface ClassA (CategoryA) 

<some private methods> 

@end 


@implementation ClassA (CategoryA) 

<here I want to be able to call the private methods above> 

@end 

अभी यह मेरे Xcode में चेतावनी दे रहा है:

श्रेणी 'केट की डुप्लिकेट परिभाषा goryA 'इंटरफेस पर' कक्षा '

क्या इस व्यवहार को पाने का कोई तरीका है?

+1

क्या -1 के लिए कारण है? क्या मैंने कुछ गलती की? –

+0

किंडा अस्पष्ट, आपको उन त्रुटियों को प्रदान करना चाहिए था जिनके बारे में आप बात कर रहे थे। लेकिन मुझे लगता है कि यह एक उत्तर के लिए पर्याप्त स्पष्ट है। – fbernardo

+2

त्रुटियां यहां प्रासंगिक नहीं हैं, वे स्पष्ट रूप से xCode के कारण सिंटैक्स को समझ नहीं रहे हैं जिसे मैं लागू करने का प्रयास कर रहा हूं। –

उत्तर

12

नहीं, आप दो इंटरफेस एक भी वर्ग के लिए की घोषणा नहीं कर सकते हैं। आप दो चीजों में से एक कर सकते हैं:

एंगलबर्ट + हम्परडिनक।ज

#import "Englebert.h" 

@interface Englebert (Humperdinck) 

- (void) croon; 

@end 

आप एक अलग नाम के साथ एक और श्रेणी घोषित निजी तरीकों को रोकने के लिए कर सकते हैं। ये तो एक ही फाइल में इस्तेमाल किया जा सकता है, जहां निजी श्रेणी इंटरफेस घोषित किया जाता है:

Englebert + Humperdinck.m

#import "Englebert+Humperdinck.h" 

@interface Englebert (HumperdinckPrivate) 

- (void) warmUp; 

@end 

@implementation Englebert (HumperdinckPrivate) 

- (void)warmUp { 
    NSLog(@"Warm up"); 
} 

@end 

@implementation Englebert (Humperdinck) 

- (void)croon { 
    [self warmUp]; 
    NSLog(@"Croon"); 
    // etc. 
} 

@end 

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

Englebert + Humperdinck.m

#import "Englebert+Humperdinck.h" 

@implementation Englebert (Humperdinck) 

/* Undeclared private method */ 
- (void)warmUp { 
    NSLog(@"Warm up"); 
} 

- (void)croon { 
    [self warmUp]; 
    NSLog(@"Croon"); 
    // etc. 
} 

@end 
+0

आपको बहुत धन्यवाद जोश। बहुत अच्छी तरह से समझाया। मुझे नवीनतम एक्सकोड के साथ पता नहीं था कि कार्यान्वयन आदेश अब और महत्वपूर्ण नहीं था, मैं इस तरह से जाऊंगा। चीयर्स। –

+0

आपका स्वागत है! –

+0

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

1

@interface ClassA (CategoryA) 

@end 

@implementation ClassA (CategoryA) 

@end 

इसके बजाय मत करो। श्रेणियों में उदाहरण varibles नहीं हो सकता है। और आप किस तरह की त्रुटियों के बारे में बात कर रहे हैं?

0

@interface ClassA()anonymous category है, और आप इन्हें इंटरफेस के रूप में उपयोग कर सकते हैं और ClassA कार्यान्वयन में कार्यान्वयन को भी परिभाषित कर सकते हैं। @interface ClassA (CategoryA)() एक सिंटैक्स त्रुटि है और पढ़ना चाहिए @interface ClassA (CategoryA)

संपादित करें:

.m फ़ाइल 'है कि कक्षा में एक वर्ग के लिए निजी तरीकों बनाने के लिए, आप होगा:

@interface ClassA() 
    // Private functions declared 
@end 

@implementation ClassA 
    // Private functions defined 
    // Other functions defined 
@end 

उसी के लिए किया जा सकता है नामित श्रेणियां, हालांकि आपको चेतावनियों से बचने के लिए अलग-अलग कार्यान्वयन को परिभाषित करने की आवश्यकता होगी। फिर, .m फ़ाइल में:

@interface ClassA (hidden) 
    // Private functions declared 
@end 

@implementation ClassA (hidden) 
    // Private functions declared 
@end 

@implementation ClassA 
    // Other functions defined 
@end 
+0

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

+0

मेरा अपडेट देखें ... –

+0

यह टिप्पणी समझ में नहीं आता है। आपके पास कार्यान्वयन फ़ाइल में इंटरफ़ेस() घोषित करके आपके वर्ग में "निजी" विधियां हो सकती हैं। आप विशिष्ट उदाहरणों/कक्षाओं पर श्रेणियां बना सकते हैं जो कि किसी भी कक्षा से उपयोग योग्य हैं। आपको और क्या चाहिए? – Rog

संबंधित मुद्दे