2009-07-30 12 views
7

में (आईडी) का उपयोग करना मेरे पास एक ऐसा कार्य है जिसे मैं दो अलग-अलग कस्टम ऑब्जेक्ट्स पर संचालित करना चाहता हूं। मेरा पहला विचार तर्क (आईडी) के रूप में स्वीकार करना और आईडी ऑब्जेक्ट पर काम करना था। हालांकि, मुझे यह पता लगाने में काफी प्रतीत नहीं होता कि यह कैसे करना है।उद्देश्य-सी

दोनों वर्गों (कहते हैं कि सेब और संतरे) इंटरफेस चर है:

NSDecimalNumber *count; 

मैं इस के समान कुछ करना चाहता हूँ:

-(NSDecimalNumber*)addCount:(id)addObject{ 

    return [count decimalNumberByAdding:addObject.count]; 
} 

मैं करने के लिए वाक्य रचना यह पता लगाने नहीं कर पा रहे ऐसा करो। क्या यह उचित दृष्टिकोण है, या यह उपclass (एक फल वर्ग कहने से) बेहतर होगा और माता-पिता वर्ग पर काम करेगा?

-(NSDecimalNumber*)addCount:(Fruit*)addFruit{ 

    return [count decimalNumberByAdding:addFruit.count]; 
} 

उत्तर

12

जबकि आप किसी ऑब्जेक्ट (आईडी) को संदेश भेज सकते हैं - संपत्ति एक्सेसर्स की आवश्यकता होती है कि संकलक उस प्रकार से अवगत रहें जिसके साथ आप काम कर रहे हैं - ऐसा इसलिए है क्योंकि संपत्ति एक्सेसर्स विशिष्ट गेटर और सेटर विधियों को कॉल करने के आसपास सिंटैक्टिक चीनी हैं।

आप इस के आसपास काम कर के तरीकों में से कुछ हैं:

  1. इसके बजाय गिनती संपत्ति तक पहुँचने का, इसी [getCount] तरीकों कहते हैं।

  2. विभिन्न वर्गों के लिए इस विधि के विभिन्न संस्करणों है, तो आप एक क्रम प्रकार की जांच का उपयोग कर सकते हैं:

  3. दोनों प्रकार के लिए एक आधार वर्ग प्रदान करें, ताकि आप (आईडी) की तुलना में कुछ अधिक विशिष्ट में पारित कर सकते हैं।

  4. प्रोटोकॉल को परिभाषित और कार्यान्वित करें कि दोनों ऑब्जेक्ट्स लागू होते हैं जो गिनती गुण (या विधि) को परिभाषित करता है। एक गतिशील प्रकार की जांच के

उदाहरण:

if([object isKindOfClass:[Apple Class]) 
    // call one overload of getCount 
else if([object isKindOfClass:[Orange Class]) 
    // call another overload of getCount 

व्यक्तिगत रूप से, मैं मजबूत टाइपिंग मेरी कोड में पक्ष है क्योंकि यह यह आसान उद्देश्य समझने के लिए बनाता है। यह आईडीई को इंटेलिजेंस, स्थिर विश्लेषण और रिफैक्टरिंग सुविधाओं के साथ आपके कोडिंग प्रयास का समर्थन करने की अनुमति देता है। इसलिए, आपके मामले में, मैं या तो # 3 या # 4 का उपयोग एक दृष्टिकोण के रूप में करता हूं - इस पर निर्भर करता है कि क्या समस्या वास्तव में समस्या के लिए उपयुक्त है या नहीं।

+1

मैं एक प्रशंसक हूँ खुद को मजबूत टाइपिंग (मैं # 4 एफवाईआई के साथ गया)। इस सूचना के लिए बहुत - बहुत धन्यवाद; यही वह है जिसकी तलाश में मैं हूं! –

+0

यदि आपको वास्तव में मजबूत टाइपिंग की आवश्यकता है, तो आपके पास C++ जैसी स्थिर भाषा के साथ बेहतर समय हो सकता है। यह एक शर्म की बात है कि गुण इस विषम तरीके से व्यवहार करते हैं। संपत्ति सिंटैक्स और रिसीवर-विधि सिंटैक्स के बीच सममित संकलन व्यवहार की अनुमति देने के लिए कम से कम एक कंपाइलर ध्वज होना चाहिए। – ctpenrose

+0

@ctpenrose Obj-C अगर आप इसे चाहते हैं तो अगली भाषा के रूप में स्थिर रूप से टाइप किया जा सकता है। – kubi

0

आप गिनने के लिए संदेश भेज रहे हैं, क्या गिनती है? आईडी किसी भी प्रकार की वस्तु के लिए एक सूचक है। यदि आप ऑब्जेक्ट की गिनती संपत्ति की अपेक्षा करते हैं, तो आपको केवल ऐरे (या कुछ अन्य प्रकार के प्रतिबंध) में प्रवेश करने में सक्षम होना चाहिए।

-(NSDecimalNumber*)addCount:(NSArray*) Object{ 

return [count decimalNumberByAdding: [Object count]]; 

} 
0

मैं यह समझ के रूप में, id क्योंकि यह एक सामान्य सूचक है कि किसी भी विशिष्ट वर्ग का उल्लेख नहीं करता है किसी भी तरीके या इसके साथ जुड़े चर नहीं है। यदि आप थोड़ा नीचे स्क्रॉल करते हैं तो This page में आईडी पर कुछ अच्छी जानकारी है।

anObject में count चर नहीं होगा, यही कारण है कि आपका पहला प्रयास काम नहीं करेगा। बेस क्लास बनाना और विधि के पैरामीटर के रूप में इसका उपयोग करना मेरे लिए सबसे अच्छा विचार है।

8

आपको किसी अन्य वर्ग से इंस्टेंस चर का उपयोग न करने का प्रयास करना चाहिए।

उद्देश्य-सी में यह पर्याप्त है कि दो ऑब्जेक्ट एक ही चयनकर्ता (count कहें) का जवाब दें, हालांकि यह आपको एक कंपाइलर चेतावनी देगा।

इस चेतावनी से छुटकारा पाने के दो तरीके हैं: या तो एक सामान्य Fruit कक्षा से उप-वर्गीकरण करके या अपने दो वर्ग प्रोटोकॉल के अनुरूप होते हैं।

@protocol FruitProtocol 

- (NSDecimalNumber *)count; 

@end 

@interface Orange : NSObject<FruitProtocol> 
@end 

@interface Apple : NSObject<FruitProtocol> 
@end 

फिर अपने विधि इस तरह दिख सकता:: मैं प्रोटोकॉल के साथ जाना चाहते हैं

-(NSDecimalNumber*)addCount:(id<FruitProtocol>)addFruit { 
    return [count decimalNumberByAdding:[addFruit count]]; 
} 

यहाँ आप कह रहे हैं कि अपने addCount किसी भी वस्तु है कि FruitProtocol प्रोटोकॉल के अनुरूप है उम्मीद है, और इसलिए कर सकते हैं count चयनकर्ता का जवाब दें, इसलिए संकलक इसे स्वीकार करेगा।

+0

wrt/"आप किसी अन्य वर्ग से इंस्टेंस चर का उपयोग नहीं कर सकते हैं।" आप निश्चित रूप से कर सकते हैं। यदि आप स्थैतिक रूप से किसी ऑब्जेक्ट को टाइप करते हैं, यानी 'MYObject * ऑब्जेक्ट;', तो आप '->' ऑपरेटर के साथ किसी भी वर्ग से अपने आवृत्ति चर का उपयोग कर सकते हैं। उदाहरण के लिए, 'MYObject' को' int' ivar नाम 'गिनती' माना जाता है, तो आप इसे एक्सेस करने के लिए 'int myCount = object-> count;' का उपयोग कर सकते हैं। '@ निजी', आदि द्वारा प्रदान की गई सुरक्षा केवल ओबीजेसी 2 में कॉस्मेटिक हैं। – johne

+0

यह बहुत अच्छा है! आपके कोड नमूने ने मेरे लिए बिना किसी खुदाई के कार्यान्वित करना आसान बना दिया है। बहुत बहुत धन्यवाद! –

+0

आप सही जॉन हैं, मैं इसे "आपको नहीं करना चाहिए" में बदल दूंगा। धन्यवाद – pgb

1

तथ्य यह है कि आप 'addFruit.count' तक पहुंचने का प्रयास कर रहे हैं, यह समस्या है। डॉट सिंटैक्स केवल @property (या structs के लिए) के साथ घोषित गुणों के लिए है। आप

[addFruit count] 

के लिए इसे बदल और प्रत्येक वर्ग के लिए

-(NSDecimalNumber*)count 
{ 
    return [[count retain] autorelease]; 
} 

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

मैं पीजीबी के दृष्टिकोण से सहमत हूं। आपको प्रोटोकॉल को परिभाषित करना चाहिए, और प्रोटोकॉल को लागू करने के लिए दोनों कक्षाओं को घोषित करना चाहिए। यह यह जानने की समस्या को समाप्त करता है कि क्या वस्तु 'गिनती' का जवाब देगी या नहीं, क्योंकि अब आपके पास 'अनुबंध' है।

आप एक संपत्ति के साथ डॉट वाक्य रचना रखना चाहते हैं, तो आप यह प्रोटोकॉल में घोषणा कर सकते हैं:

@protocol FruitProtocol 

@property(readonly) NSDecimalNumber * count; 

- (NSDecimalNumber *)count 

@end 

और फिर, अपने कार्य होगा:

-(NSDecimalNumber*)addCount:(id<FruitProtocol>)addObject{ 

    return [count decimalNumberByAdding:addObject.count]; 

} 
+0

भी बढ़िया! मैंने इसे पहले नहीं पकड़ा था। पारितोषिक के लिए धन्यवाद! –

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

  • कोई संबंधित समस्या नहीं^_^