2010-09-08 6 views
7

उद्देश्य सी में कार्य ओवरलोडिंग संभव है?
ठीक है, अधिकांश प्रोग्रामरों को नहीं कहते हैं,
लेकिन यह संभव तरह लग रहा है, उदाहरण के लिए
:उद्देश्य सी में कार्य ओवरलोडिंग संभव है?

-(int)AddMethod:(int)X :(int)Y 
{ 
    return X + Y; 
} 
-(int)AddMethod:(int)X 
{ 
    return X; 
} 

कॉल करने के लिए 1 एक [self AddMethod :3];
बारे में पिछले एक [self AddMethod: 3 :4];

+0

मैं पढ़ लिया है कई बार कह रही है कि समारोह से अधिक भार प्रोग्रामर उद्देश्य सी में संभव नहीं है – Matrix

+0

मैं सही हूँ? .... – Matrix

+6

यह अधिभारित नहीं है, आपके तरीकों के अलग-अलग चयनकर्ता हैं (= नाम)। एक 'AddMethod:' है और दूसरा 'AddMethod :: ' – Sven

उत्तर

22

उद्देश्य-सी में विधि अधिभार संभव नहीं है। हालांकि, आपका उदाहरण वास्तव में काम करेगा क्योंकि आपने अलग-अलग चयनकर्ताओं के साथ दो अलग विधियों का निर्माण किया है: -AddMethod:: और AddMethod:। प्रत्येक इंटरलीव किए गए पैरामीटर के लिए एक कोलन है। कुछ पाठ भी उदास करना सामान्य है -addMethodX:Y: लेकिन आपको यह नहीं करना है।

+1

आपके पास दूसरे पैरामीटर को लेबल करने के लिए * नहीं है, लेकिन वास्तव में ... आपको करना है। अपने कोड को जानबूझकर निकालने का कोई कारण नहीं है। – kubi

+2

@ कुबी: पूरी तरह से सहमत हैं। यह वही है "जैसा नहीं है" जैसा कि "आपको सी चर नामों में अक्षरों का उपयोग करने की आवश्यकता नहीं है, आप केवल अंडरस्कोर के तारों का उपयोग कर सकते हैं"। – JeremyP

+0

मैं उलझन में हूं ... मैंने सोचा था कि विधि ओवरलोडिंग (या तो विभिन्न प्रकार के तर्क या प्रकार) के रूप में गिना जाता है संपादित करें: ठीक है, ऐसा लगता है कि केवल आपके लिए लोगों के अधिभार के रूप में गणना की जाती है ...ऑनलाइन कई उदाहरणों में, मैं देखता हूं कि अलग-अलग हस्ताक्षर भी "अधिभार" के रूप में गिना जाता है। आह ... – dtc

4

बारे में कोई कॉल करने के लिए, ऐसा नहीं है, क्योंकि ज्यादातर उद्देश्य-सी कार्यों का उपयोग नहीं करता है, यह विधियों का उपयोग करता है।

दूसरी ओर, विधि अधिभार, संभव है। की तरह।

पर विचार करें, यदि आप होगा, एक विधि के साथ एक वर्ग के फार्म पर एक तर्क ले या तो एक NSString * या एक const char *:

@interface SomeClass : NSObject { 

} 

- (void)doThingWithString:(NSString *)string; 
- (void)doThingWithBytes:(const char *)bytes; 

@end 

विधि के साथ ही उचित विधि चुनने के चारों ओर जाना नहीं करते हैं एक दिया इनपुट; कोई अभी भी कह सकता है कि doThing: अधिभारित किया गया था, कम से कम इस अर्थ में कि दो विधियां समान कार्यक्षमता प्राप्त करने के लिए एक अलग पैरामीटर ले रही हैं।

+2

15 से इसका क्या अर्थ है? – vodkhang

+0

उत्तर कम से कम 15 वर्ण लंबा होना चाहिए; तो मैंने थोड़ा सा बाहर निकाला। ;) –

+5

उदाहरण * ओवरलोडिंग * की तरह भी नहीं है, ये केवल दो अलग-अलग विधियां हैं जिनके लिए नामकरण कुछ अर्थपूर्ण संबंधों का तात्पर्य है। ओवरलोडिंग की अनुपस्थिति में इसका सामान्यतः उपयोग किया जाने वाला विकल्प। –

2

तकनीकी रूप से, उद्देश्य-सी में विधि अधिभार संभव नहीं है। अभ्यास में आप आमतौर पर वही परिणाम प्राप्त कर सकते हैं, ऐसे मामलों में जहां आप सी ++ में नहीं कर सकते थे। उद्देश्य-सी में, विधि नामों में प्रत्येक तर्क के सामने एक कोलन शामिल होता है, और कोलन विधि नाम का हिस्सा होते हैं, जिसका अर्थ है कि आपका उदाहरण विभिन्न विधि नामों का उपयोग करता है। प्रैक्टिस में यह छद्म नामित पैरामीटर कार्यक्षमता का एक प्रकार बन जाता है, और आप तर्क TYPE के बजाय तर्क फ़ंक्शन द्वारा एक छद्म विधि अधिभार प्राप्त कर सकते हैं। ज्यादातर मामलों में यह वास्तव में अधिक उपयोगी होगा, लेकिन यह सख्त अर्थ में विधि अधिभार नहीं है, क्योंकि विधि नाम अलग हैं।

उदाहरण:

-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 X2:(float)x2 Y2:(float)y2; 
-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 width:(float)width height:(float)height; 

यह ऑब्जेक्टिव-सी में काम करेगा, लेकिन आप सी ++ में इसी तरह की सुविधा नहीं मिल सका, तर्क संख्या और प्रकार के होते हैं, क्योंकि एक ही है, केवल तर्क कार्यों अलग हैं। कुछ मामलों में सी ++ मॉडल अधिक उपयोगी कार्यक्षमता प्राप्त कर सकता है। यह NSKeyedArchiver वर्ग द्वारा दर्शाया गया है:

-(void)encodeFloat:(float)realv forKey:(NSString *)key 
-(void)encodeInt32:(int32_t)intv forKey:(NSString *)key 

यहाँ वे तर्क प्रकारों moethod नाम है, जो बदसूरत है का हिस्सा बनाने के लिए किया था। अगर मैं सी ++ ओवरलोडिंग और ऑब्जेक्टिव-सी "ओवरलोडिंग" के बीच चयन कर सकता हूं, तो भी मैं बाद वाले को चुनूंगा।

@interface MyClass 
{ 
} 
@end 

@interface MyClass (MethodVersion1) 
- (void) doSomething : (int) val; 
@end 

@interface MyClass (MethodVersion2) 
- (void) doSomething : (double) val; 
@end 

अलग पैरामीटर प्रकार से श्रेणियाँ हल कर रहे हैं:

-1

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

2

आप एक सामान्य तरीका है जिसके मार्गों वस्तु आप में पास के प्रकार के आधार के साथ शुरू कर सकता है।

- (void)doSomething:(id)obj; 

तो फिर तुम अगर यह NSData या UIImage है देखने के लिए प्रकार की जांच और यह रूट करने के लिए आंतरिक रूप से कर सकते हैं उचित तरीके

- (void)doSomethingWithData:(NSData *)data; 
- (void)doSomethingWithImage:(UIImage *)image; 

तुम भी केवल समर्थन की उम्मीद प्रकार के लिए चुनते हैं और शान से कर सकते हैं असमर्थित प्रकार की प्रक्रिया या स्पष्ट रूप से विफल गिरावट।

अन्य दृष्टिकोण के लिए एनएसएएसएसर्ट 1, एनएसएएसएसर्ट 2, आदि देखें।

0

ध्यान दें कि यदि आप सी ++ के साथ उद्देश्य-सी को जोड़ते समय कार्यों को अधिभारित करना चाहते हैं तो यह संभव है। मैं केवल इसका जिक्र करता हूं क्योंकि एक्सकोड में आपको अपनी .m फ़ाइल को एक .mm फ़ाइल में बदलने की आवश्यकता होती है ताकि इसे इस तरह से इलाज किया जा सके, जिसने मुझे कुछ मिनट तक फिसल दिया।

उदाहरण हैडर:

void addMethod(NSInteger a); 
void addMethod(NSInteger a, NSInteger b); 

आप एक मीटर फ़ाइल में इस सहित रहे हैं, तो आप एक चेतावनी मिल जाएगा:

'addMethod'

बदलने के लिए प्रकार विरोधी एक .mm में आपकी .m फ़ाइल समस्या को साफ़ करती है।

0

आप नए कंपाइलर्स के साथ सी कार्यों को अधिभारित कर सकते हैं - सिंटैक्स थोड़ा छोटा है हालांकि (कुछ भी नहीं # डिफाईन ठीक नहीं हो सकता है), लेकिन यह अच्छी तरह से काम करता है।

function overloading in C

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