2012-03-14 12 views
16

स्थिति निम्नलिखित पर विचार करें:क्या जावा उद्देश्य सी में श्रेणी की तरह कुछ कर सकता है?

Object > MyClass > MyClassA, MyClassB 

अगर मैं वस्तु स्तर में कुछ चाहते हैं, उदाहरण के लिए, मैं printDetail जोड़ा(); जावा कार्यान्वयन में मैं इसे कैसे कर सकता हूं? इसके अलावा, क्या मैं ऑब्जेक्ट की सभी विधियों को ओवरराइड कर सकता हूं। उदाहरण के लिए, मुझे एक नया नया होना चाहिए .toString(), क्या मैं इसे ओवरराइड कर सकता हूं? धन्यवाद।

उत्तर

28

नहीं, वास्तव में वैसे भी नहीं। उद्देश्य सी गतिशील रूप से टाइप की गई और स्कॉप्ड भाषा है, जो इसे श्रेणियों जैसी सुविधाओं के लिए बहुत ही अनुकूल बनाता है। जावा में आप निकटतम आ सकते हैं एक बाइट कोड मैनिपुलेशन लाइब्रेरी जैसे ASM या Javassist के माध्यम से कक्षा उपकरण है।

लेकिन वास्तव में, जावा की तरह दृढ़ता से टाइप की गई ओओ भाषा का उपयोग करते समय आपको किसी अन्य भाषा को डुप्लिकेट करने की बजाय इसकी विशेषताओं को गले लगा देना चाहिए।

+0

महान उत्तर .. !! –

+0

यद्यपि टिप्पणी कुछ हद तक अकादमिक है, मुझे लगता है कि यह मुद्दा फैक्टरिंग है: उदा। अगर मैं किसी सरणी में चीजों के क्रम को यादृच्छिक बनाने का तरीका चाहता हूं तो मैं कह सकता हूं "अर्थात् यह सही है कि मैं एक क्रिया को सही तरीके से करने के लिए कहूंगा; इसलिए मैं इसे सरणीय रूप से सरणी पर एक विधि के रूप में जोड़ूंगा"। जो मुझे दृढ़ता से टाइप या ऑब्जेक्ट उन्मुख होने के खिलाफ कटौती नहीं लगता है। लेकिन, नहीं, यह जावाश नहीं है। – Tommy

+1

सी # एक दृढ़ता से टाइप ओओ भाषा नहीं है? क्योंकि सी # एक्सटेंशन विधियों के माध्यम से इस क्षमता की पेशकश करता है। अन्य भाषाओं से अच्छी चीजें लेने में क्या गलत है? यह प्रगति का एक तरीका है ... – obe

2

सभी जावा कक्षाओं में अंततः java.lang.Object है, इसलिए से सभी Java classes inherit विधियां। इन तरीकों में से आधे final हैं और overridden नहीं हो सकते हैं। हालांकि, ऑब्जेक्ट में अन्य विधियां
ऑब्जेक्ट क्लास में ToString() विधि किसी ऑब्जेक्ट के बारे में कुछ जानकारी प्रदर्शित करने के लिए उपयोग की जाती है।
तो आप अपने स्वयं के अनुसार यह ओवरराइड कर सकते हैं ...
पूर्व ..

public class Test{ 
    @Override 
    public String toString() { 
    /// staff 
    } 
} 
+0

मैं देखता हूं। मैं रूबी का उपयोग करता हूं, जो मुझे शीर्ष स्तर की वस्तु को ओवरराइड करने की अनुमति देता है। – DNB5brims

11

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

@interface NSString (MyCategory) 

/** 
* Creates and autoreleased image from self. 
*/ 
- (NSString*)quotedString; 

@end 

@implementation NSString (MyCategory) 

- (NSString *)quotedString 
{ 
    return [NSString stringWithFormat:@"\"%@\"", self]; 
} 

@end 

आप इस तरह कहीं से कहेंगे:

public class StringHelper { 

    public static String quotedString(String that) { 
     return '"' + that + '"'; 
    } 
} 

और कॉल करने के लिए:

NSString *myString = @"When you're curious, you find lots of interesting things to do."; 
NSString *quotedString = [myString quotedString]; 

यहाँ कैसे मैं जावा में यह लागू होता है यह:

String myString = = "When you're curious, you find lots of interesting things to do."; 
String quotedString = StringHelper.quotedString(myString); 

यदि आप श्रेणी विधियों के बारे में सोचते हैं जो स्वचालित रूप से स्वयं चर को पहली विधि तर्क (अदृश्य के बावजूद) भेजते हैं तो यह और भी समझ में आता है।

अपने उदाहरण के लिए

, अगर मैं विशिष्ट वस्तु का विस्तार नहीं होगा, मैं की तरह कुछ कर सकता:

public class ObjectHelper { 

    public static void printDetail(Object that) { 
     // do what it takes; 
    } 
} 

अद्यतन: सीमाओं के लिए कहा एक टिप्पणीकार।

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

public class StringHelper { 
    private static Map<String, Integer> order = new HashMap(); 

    public static int getOrder(String that) { 
     if(that == null) { return 0; } 
     Integer ret = StringHelper.order.get(that); 
     if(ret == null) { return 0; } 
     else { return ret; } 
    } 
    public static void setOrder(String that, int order) { 
     if(that != null) { 
      StringHelper.order.put(that, order); 
     } 
    } 
} 

मूल वर्ग के साथ कोई नाम संघर्ष भी नहीं है, जो कि अधिक लाभ होगा। उद्देश्य-सी श्रेणियों में नाम संघर्ष खराब माना जाता है।

+0

मुझे यह जवाब सबसे अच्छा लगता है क्योंकि यह मुझे एक कामकाज देता है। धन्यवाद! –

+0

@ptoinson यदि हम आईओएस में श्रेणी के साथ इस तरह की तुलना करते हैं तो सीमाएं क्या होती हैं? – NghiaDao

+0

@ नाघियादाओ - उत्तर को उत्तर में अपडेट में जोड़ा गया। – ptoinson

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