मैं आईओएस प्रोजेक्ट में प्रोटोकॉल बफर का उपयोग करना चाहता हूं। मैं पूरी परियोजना को एक उद्देश्य-सी ++ फियास्को में बनाने से बचने की कोशिश कर रहा हूं, इसलिए मैं सी ++ प्रोटोबफ कक्षाओं को उद्देश्य-सी में लपेटना चाहता हूं। मेरे पास कई दर्जन प्रोटोबफ संदेश हैं, और जब मैंने एक बार में सफलतापूर्वक एक कक्षा की है, तो आदर्श रूप से मैं दोहराए गए कोड को कम करने के लिए विरासत का उपयोग करना चाहता हूं। मैं उद्देश्य-सी के लिए नया हूं और मैंने 10 वर्षों में सी ++ के बारे में जो कुछ भी नहीं जानता था, उतना ही उपयोग नहीं किया है, इसलिए यह ज्यादातर निराशा में एक अभ्यास रहा है। नीचे एक उदाहरण है कि मैंने एक संदेश कैसे लपेट लिया है।क्या उद्देश्य-सी में प्रोटोकॉल बफर को लपेटने का कोई तरीका है और अभी भी विरासत का लाभ उठाएं?
कोड
.proto:
message MessageA {
optional string value = 1;
}
MessageAWrapper.h:
#import <Foundation/Foundation.h>
@interface MessageAWrapper : NSObject
@property (nonatomic) NSString *value;
+ (id)fromString:(NSString *)string;
- (NSString *)serialize;
@end
MessageAWrapper.mm:
#import "MessageA.h"
#import "message.pb.h"
@interface MessageAWrapper()
@property (nonatomic) MessageA *message;
@end
@implementation MessageAWrapper
- (id)init
{
self = [super init];
if (self) {
self.message = new MessageA();
}
return self;
}
- (void)dealloc {
delete self.message;
self.message = NULL;
}
- (NSString *)value {
return [NSString stringWithUTF8String:self.message->value().c_str()];
}
- (void)setValue:(NSString *)value {
self.message->set_value([value UTF8String]);
}
- (NSString *)serialize {
std::string output;
self.message->SerializeToString(&output);
return [NSString stringWithUTF8String:output.c_str()];
}
+ (id)fromString:(NSString *)string {
MessageA *message = new MessageA();
message->ParseFromString([string UTF8String]);
MessageAWrapper *wrapper = [[MessageAWrapper alloc] init];
wrapper.message = message;
return wrapper;
}
@end
लक्ष्य
वहाँ कोड है कि यहाँ तक दर्जनों बार दोहराया जाएगा का एक बहुत कुछ है, जिसमें केवल भिन्नता लिपटे वर्ग प्रकार (init
, dealloc
, serialize
, fromString
), इसलिए आदर्श मैं पर डाल करना चाहते हैं है इसके बजाय एक माता-पिता ProtobufMesssage
कक्षा। दुर्भाग्यवश मुझे इस काम को करने में कोई सफलता नहीं मिली क्योंकि मुझे अभिभावक वर्ग के लिए कक्षा का पता लगाने का कोई तरीका नहीं मिल रहा है, जिसका उदाहरण init
और fromString
में है।
चीजें मैं का प्रयास किया है
- struct
- टेम्पलेट वर्ग
- शून्य *
बाधाओं मैं
-
का सामना करना पड़ा
- एक वर्ग/प्रकार
- ज फ़ाइल में किसी भी सी ++ हेडर या कोड नहीं हो सकता है (के रूप में इस ऑब्जेक्टिव-सी होने के लिए पूरी परियोजना की आवश्यकता है ++)
- के लिए एक संदर्भ स्टोर करने के लिए एक तरह से नहीं मिल सकता है Protobuf संदेश माता-पिता (
Message
याMessageLite
), क्योंकि वे सार
जैसा कि मैंने कहा मैं सी ++ या ऑब्जेक्टिव-सी की बहुत कम समझ है के लिए संदर्भ रखने कठिनाई; मेरा अधिकांश अनुभव पायथन और जावा जैसे उच्च स्तर की भाषाओं के साथ है (हालांकि मैं ज्यादातर मूल सी चीजों को पॉइंटर्स समझता हूं)।
क्या यह शायद संभव भी नहीं है? क्या मैं इसे गलत कर रहा हूं या कुछ स्पष्ट याद कर रहा हूं? कोई भी सहायताकाफी प्रशंसनीय होगी। धन्यवाद।
'dynamic_cast' का उपयोग करके बेहतर होगा – newacct