Comment gérer l'héritage dans Google Protocol Buffers 3.0?
Code équivalent Java:
public class Bar {
String name;
}
public class Foo extends Bar {
String id;
}
Quel serait le code équivalent Proto?
message Bar {
string name = 1;
}
message Foo {
string id = 2;
}
Les tampons de protocole ne prennent pas en charge l'héritage. Envisagez plutôt d'utiliser la composition:
message Foo {
Bar bar = 1;
string id = 2;
}
Cependant, cela dit, il y a une astuce que vous pouvez utiliser qui est comme l'héritage - mais qui est un vilain hack, vous ne devez donc l'utiliser qu'avec précaution. Si vous définissez vos types de messages comme:
message Bar {
string name = 1;
}
message Foo {
string name = 1;
string id = 2;
}
Ces deux types sont compatible, car Foo
contient un sur-ensemble des champs de Bar
. Cela signifie que si vous avez un message codé d'un type, vous pouvez le décoder comme l'autre type. Si vous essayez de décoder un Bar
de type Foo
, le champ id
ne sera pas défini (et obtiendra sa valeur par défaut). Si vous décodez un Foo
de type Bar
, le champ id
sera ignoré. (Notez que ce sont les mêmes règles qui s'appliquent lors de l'ajout de nouveaux champs à un type au fil du temps.)
Vous pouvez éventuellement l'utiliser pour implémenter quelque chose comme l'héritage, en ayant plusieurs types qui contiennent tous une copie des champs de la "superclasse". Cependant, il y a quelques gros problèmes avec cette approche:
Foo
en type Bar
, vous devez sérialiser et ré-analyser; vous ne pouvez pas simplement lancer. Cela peut être inefficace.Voir le tutoriel Protocol Buffer Basics :
N'allez pas à la recherche d'installations similaires à l'héritage de classe, cependant - les tampons de protocole ne le font pas.