2009-02-11 7 views
182

मैं यह जांचना चाहता हूं कि कोई ऑब्जेक्ट (उदा। someObject) किसी अन्य प्रकार के चर के लिए असाइन करने योग्य (कास्ट-सक्षम) है (उदा। SpecifiedType)। जावा में, मैं लिख सकता हूं:उद्देश्य-सी में, जावा के "exampleof" कीवर्ड के बराबर क्या है?

someObject instanceof SpecifiedType 

एक संबंधित प्रश्न यह पता लगा रहा है कि किसी ऑब्जेक्ट का रनटाइम प्रकार किसी दूसरे प्रकार के बराबर है या नहीं। जावा में, मैं लिख सकता हूं:

someObject.getClass().equals(SpecifiedType.class) 

उद्देश्य-सी में यह कैसे किया जा सकता है?

+0

यह भी देखें: http://stackoverflow.com/q/8294076/165674 –

उत्तर

251

किसी ऑब्जेक्ट की कक्षा को वापस करने के लिए [myObject class] आज़माएं। सीधे MyClass पहचानकर्ता का उपयोग करके

if ([myObject class] == [MyClass class]) 

लेकिन नहीं:

आप के साथ सटीक तुलना कर सकें। के रूप में जॉन स्कीट और zoul ने सुझाव दिया

if ([myObject isKindOfClass:[AnObject class]]) 

:

इसी तरह, आप अगर वस्तु के साथ अपने वर्ग का एक उपवर्ग की है पा सकते हैं।

+0

मैं कैसे जांच करूंगा उदाहरण के लिए "AnObject" प्रकार की वस्तु के साथ समानता? – Dimitris

+0

"अगर ([myObject class] == [AnObject class])" या, जैसा कि जॉन स्कीट और ज़ोल द्वारा सुझाया गया है: "अगर ([myObject isKindOfClass: [AnObject class]])" – mouviciel

+7

सटीक तुलना भी 'if के साथ की जा सकती है ([myObject isMemberOfClass: [MyClass class]]) – user102008

37
Wikipedia से

:

ऑब्जेक्टिव-सी में, उदाहरण के लिए, दोनों सामान्य Object और NSObject प्रदान विधि ( कोको/OpenStep में) isMemberOfClass: जो विधि के लिए true अगर तर्क देता है निर्दिष्ट कक्षा का उदाहरण है। विधि isKindOfClass: समान रूप से निर्दिष्ट होता है यदि तर्क निर्दिष्ट कक्षा से प्राप्त करता है।

isKindOfClass: इसकी आवाजों से instanceof के निकटतम होगा।

8

NSObject दस्तावेज़ में isKindOfClass: विधि देखें। (इस तरह के प्रश्न के लिए चेतावनी का सामान्य शब्द यह है कि ऑब्जेक्ट क्लास की जांच करना अक्सर कुछ गलत करने का संकेत होता है।)

+2

बस नीचे दिए गए "उत्तर" से प्रतिलिपि बना रहा है: "@Zoul - कक्षा प्रकार की जांच का उपयोग क्यों बुरा माना जाता है? क्या यह अच्छा रक्षात्मक प्रोग्रामिंग नहीं है या आप बहस कर रहे हैं कि यह अनावश्यक होना चाहिए? " –

+1

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

+0

@zoul उस विशिष्ट मामले में यह केवल सादा अनुभवहीन होगा, एक अधिक संभावना है कि '+ (BOOL) अनुरूप है टोटोप्रोकॉल: (प्रोटोकॉल *) एक प्रोटोकॉल'। – EricLeaf

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