प्रोटोकॉल बफर विरासत का समर्थन नहीं करता है। , कि कहा, वहाँ एक चाल आप उपयोग कर सकते हैं जो विरासत की तरह है
message Foo {
Bar bar = 1;
string id = 2;
}
हालांकि - लेकिन जो एक बदसूरत हैक है ताकि आप केवल यह ध्यान के साथ उपयोग करना चाहिए: इसके बजाय, रचना का उपयोग करें। आपके द्वारा निर्धारित यदि आपके संदेश प्रकारों की तरह:
message Bar {
string name = 1;
}
message Foo {
string name = 1;
string id = 2;
}
इन दो प्रकार के संगत हैं, क्योंकि Foo
Bar
के क्षेत्र के एक सुपरसेट शामिल हैं। इसका अर्थ यह है कि यदि आपके पास एक प्रकार का एन्कोडेड संदेश है, तो आप इसे दूसरे प्रकार के रूप में डीकोड कर सकते हैं। यदि आप Bar
को Foo
टाइप करने का प्रयास करते हैं, तो फ़ील्ड id
सेट नहीं किया जाएगा (और इसका डिफ़ॉल्ट मान प्राप्त होगा)। यदि आप Foo
को Bar
टाइप करते हैं, तो फ़ील्ड id
को अनदेखा कर दिया जाएगा। (ध्यान दें कि ये वही नियम हैं जो समय के साथ एक प्रकार में नए फ़ील्ड जोड़ते समय लागू होते हैं।)
आप संभवतः इस तरह का उपयोग विरासत की तरह कुछ लागू करने के लिए कर सकते हैं, जिसमें कई प्रकार के होते हैं जिनमें से सभी के खेतों की एक प्रति होती है "superclass"। हालांकि, इस दृष्टिकोण के साथ एक जोड़ी बड़ी समस्या हैं:
- प्रकार
Foo
का संदेश वस्तु परिवर्तित करने के लिए टाइप करने के लिए Bar
, आप को क्रमानुसार और फिर से पार्स करने के लिए है; आप सिर्फ कास्ट नहीं कर सकते हैं। यह अक्षम हो सकता है।
- सुपरक्लास में नए फ़ील्ड जोड़ने में बहुत मुश्किल है, क्योंकि आपको यह सुनिश्चित करना होगा कि प्रत्येक उपclass में फ़ील्ड जोड़ना है और यह सुनिश्चित करना है कि इससे कोई फ़ील्ड नंबर विवाद नहीं हो।
स्रोत
2016-12-21 05:50:57
विरासत प्रोटोकॉल बफर में समर्थित नहीं है। यह http://stackoverflow.com/questions/29263507/extending-protobuf- संदेश – Yousaf