2009-06-10 22 views
13

मैं कर रहा हूँ नया करने के लिए Obj सी तो मुझे माफ कर दो अगर यह एक बेवकूफ सवाल है:उद्देश्य-सी में जावा-एनम शैली कक्षाएं?

मैं कैसे Javas enums की शैली में कुछ लागू करते हैं? या अधिक सटीक होने के लिए:

मुझे कुछ ज्ञात गुणों वाला एक वर्ग चाहिए जो संकलन समय और अद्वितीय प्रति उदाहरण पर ठीक हो। इसके अतिरिक्त मैं केवल एक उदाहरण प्रकार चाहता हूं।

मुझे जावा में एक उदाहरण देता हूँ:

public enum MessageTypes { 
    DEFAULT("white", "standard", 1), 
    EXPRESS("red", "expressMessage", 2), 
    BORADCAST("green", "broadcast", 3); 

    String color; String tagName; int dbId; 
    MessageTypes(String color, String tagName, int dbId) { 
    // you get the idea 
    } 
    //some methonds like getEnumByTagName 
} 

कैसे आप ऑब्जेक्टिव-सी में कुछ इस तरह करना होगा? क्या मैं कुछ भूल रहा हूँ? क्या यह एक बुरा पैटर्न है?

अग्रिम धन्यवाद!

संपादित करें: मुझे खेद है, अगर मैंने खुद को स्पष्ट नहीं किया है। मुझे पता है, कि obj-c enums वे नहीं हैं जो मैं ढूंढ रहा हूं (क्योंकि वे केवल int में टाइप किए गए टाइप से अधिक हैं)।

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

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

जावा में, मैं अपने कोड नमूने के रूप में एक enum का उपयोग करेंगे। लेकिन मैं विभिन्न संदेश प्रकार कैसे बना सकता हूं और उन्हें ओब्जे-सी में अपनी संपत्तियों के साथ जोड़ सकता हूं?

संदेश प्रकार के 20 सब्सक्राइसेस बनाना (गुणों को धारण करने वाले सिंगलटन-उदाहरण वाले प्रत्येक) ऐसे सरल कार्य और कुल ओवरकिल के लिए बहुत सारे काम की तरह दिखते हैं।

मेरा वर्तमान दृष्टिकोण एनएसएआरएआरई के साथ अलग-अलग उदाहरण रखने वाले वर्ग को बनाना है। +(id)messageTypeForId:NSInteger id_ जैसी विधि की पहली पहुंच पर एनएसएआरएआरई प्रीपोप्टेड है। लेकिन यह पूरी तरह से बेकार लगता है और बिल्कुल सुरुचिपूर्ण नहीं ...

क्या कोई और संतोषजनक दृष्टिकोण है?

उत्तर

7

"अधिक संतोषजनक दृष्टिकोण" के रास्ते में बहुत कुछ नहीं है।

+ (MessageTypes*) sharedDefaultMessageType; 
+ (MessageTypes*) sharedExpressMessageType; 
+ (MessageTypes*) sharedBroadcastMessageType; 
etc 

और फिर उन्हें तरह कुछ को लागू:

+ (MessageTypes*) sharedDefaultMessageType 
{ 
    static MessageTypes* thisMessageType = nil; 
    if (!thisMessageType) { 
     thisMessageType = [[MessageTypes alloc] initWithColor:@"white" tagName:@"standard" dbId:1]; 
    } 
    return thisMessageType; 
} 

वैकल्पिक रूप से, एक NSMutableArray या NSMutableDictionary या precalculating में साझा MessageType * भंडारण

सामान्य कोको पैटर्न की तरह तरीकों बनाने के लिए किया जाएगा जैसा कि आप कर रहे हैं वे सभी समान मान्य अनुमोदन हैं।

ध्यान दें कि ऊपर "टेम्पलेट" विधि एक मैक्रो के माध्यम से उत्पन्न किया जा सकता ऐसी है कि आप मीटर फ़ाइल में लिख सकते हैं:

CREATEMESSAGETYPE(Default, @"white", @"standard", 1) 
CREATEMESSAGETYPE(Express, @"red", @"expressMessage", 2) 
CREATEMESSAGETYPE(Broadcast, @"green", @"broadcast", 3) 

, "संतोषजनक" या अधिक बदसूरत हो सकता है पर निर्भर करता है आपके दृष्टिकोण।

+0

मैक्रो मेरे दृष्टिकोण में अधिक बदसूरत है लेकिन मुझे वास्तव में आपका पहला समाधान पसंद है। यह मेरे दृष्टिकोण की तुलना में बेहतर (और अधिक कोको-जैसा) प्रतीत होता है। धन्यवाद। –

+0

मैं देख रहा हूँ कैसे 'default' और' shared' कुछ कक्षाओं में सम्मेलन द्वारा उपयोग किया जाता है, तो उन जैसे अन्य अन्य उपसर्गों कर रहे हैं? – zekel

+0

आपके पहले समाधान में आप यह जांच क्यों करते हैं कि यह मैसेज टाइप करने से पहले यह मैसेज टाइप शून्य है? इससे पहले की रेखा के कारण यह हमेशा शून्य नहीं होगा? एक नौसिखिया मदद करने के लिए Thx। –

1

मुझे लगता है कि मैं सिर्फ एक मानक सी enum का उपयोग करेंगे:

typedef enum { MT_WHITE, MT_RED, MT_GREEN } MessageType; 

तो फिर तुम बस के रूप में आप किसी भी अन्य डेटा प्रकार इसका इस्तेमाल:

@interface Blah {} 

-(void) setMessageType:(MessageType)newMessageType; 

@end 
+4

ठीक है, तो मुझे अपनी संपत्तियां नहीं मिलती हैं, जो प्रति उदाहरण अद्वितीय हैं। –

0

Enums सी में वस्तुओं नहीं हैं, और इस प्रकार उद्देश्य-सी में भी नहीं। वे केवल उपयोगकर्ता परिभाषित स्केलर हैं जिनके पास नामित मूल्यों का सीमित सेट है जो वे ले सकते हैं। आप एक ऑब्जेक्ट गुण दे सकते हैं जो enum प्रकार हैं, जो मुझे लगता है कि आप जो खोज रहे हैं उसके सबसे नज़दीकी हैं।

यदि कुछ विशिष्टता है तो आपको इस कार्यक्षमता के साथ पूरा करने की आवश्यकता है, तो आप यह इंगित करने के लिए अपनी पोस्ट संपादित करना चाहेंगे।

0

मेरे पास एक ही प्रश्न अधिक या कम था, लेकिन उपरोक्त सभी समाधानों को स्टाइलिस्टिक रूप से बेकार पाया गया। विशेष रूप से जब किसी ऑब्जेक्ट पर सी सीम संपत्ति का उपयोग करते हैं तो आप जावा एनम्स के सिंगलटन अर्थशास्त्र खो देते हैं। जावा enums के उपयोग में मुझे मिली सबसे बड़ी आजादी यह है कि एक enum के उदाहरण वास्तव में सिंगलटन subclasses हैं, और इसलिए विधि polymorphism में भाग लेते हैं। अद्वितीय गुणों के साथ enums की तुलना में भी अधिक शक्तिशाली polymorphic व्यवहार के साथ enums है।

यह देखते हुए कि इस प्रमुख विशेषता मैं के बाद सिंगलटन निजी उपवर्गों के साथ एक ऑब्जेक्टिव-सी वर्ग क्लस्टर वांछित व्यवहार के साथ एक दृष्टिकोण होगा हूँ, कार्यान्वयन लागत और जटिलता में शीर्ष पर एक सा होने के बावजूद?

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