अन्य उत्तर में उल्लेख किया है, वहाँ वास्तव में एक वर्ग ऐसा कुछ नहीं है। मेरे पास जावा पर पोर्टिंग करते समय मेरे उद्देश्य-सी कोड में कुछ श्रेणियों के लिए उपयोग किए जाने वाले कुछ सामान्य समाधान हैं। मेरी कई उद्देश्य-सी श्रेणियां मौजूद हैं क्योंकि मैं आईओएस बेस क्लास का विस्तार नहीं करना चाहता हूं लेकिन मैं उस वर्ग में कुछ कार्यक्षमता जोड़ना चाहता हूं। उन उद्देश्य-सी श्रेणियों में से कई 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);
}
}
}
मूल वर्ग के साथ कोई नाम संघर्ष भी नहीं है, जो कि अधिक लाभ होगा। उद्देश्य-सी श्रेणियों में नाम संघर्ष खराब माना जाता है।
महान उत्तर .. !! –
यद्यपि टिप्पणी कुछ हद तक अकादमिक है, मुझे लगता है कि यह मुद्दा फैक्टरिंग है: उदा। अगर मैं किसी सरणी में चीजों के क्रम को यादृच्छिक बनाने का तरीका चाहता हूं तो मैं कह सकता हूं "अर्थात् यह सही है कि मैं एक क्रिया को सही तरीके से करने के लिए कहूंगा; इसलिए मैं इसे सरणीय रूप से सरणी पर एक विधि के रूप में जोड़ूंगा"। जो मुझे दृढ़ता से टाइप या ऑब्जेक्ट उन्मुख होने के खिलाफ कटौती नहीं लगता है। लेकिन, नहीं, यह जावाश नहीं है। – Tommy
सी # एक दृढ़ता से टाइप ओओ भाषा नहीं है? क्योंकि सी # एक्सटेंशन विधियों के माध्यम से इस क्षमता की पेशकश करता है। अन्य भाषाओं से अच्छी चीजें लेने में क्या गलत है? यह प्रगति का एक तरीका है ... – obe