Google Protocol Buffers 3.0 で継承を処理するには?
Java の同等のコード:
public class Bar {
String name;
}
public class Foo extends Bar {
String id;
}
Proto に相当するコードは何ですか?
message Bar {
string name = 1;
}
message Foo {
string id = 2;
}
Google Protocol Buffers 3.0 で継承を処理するには?
Java の同等のコード:
public class Bar {
String name;
}
public class Foo extends Bar {
String id;
}
Proto に相当するコードは何ですか?
message Bar {
string name = 1;
}
message Foo {
string id = 2;
}
Protocol Buffers は継承をサポートしていません。代わりに、コンポジションの使用を検討してください。
message Foo {
Bar bar = 1;
string id = 2;
}
しかし、そうは言っても、継承のような使用できるトリックがありますが、これは醜いハックであるため、注意して使用する必要があります。メッセージの種類を次のように定義する場合:
message Bar {
string name = 1;
}
message Foo {
string name = 1;
string id = 2;
}
のフィールドのスーパーセットが含まれているため、これら 2 つのタイプは互換性があります。これは、あるタイプのエンコードされたメッセージがある場合、それを別のタイプとしてデコードできることを意味します。aを type としてデコードしようとすると、フィールドは設定されません (デフォルト値が取得されます)。aを type としてデコードすると、フィールドは無視されます。(これらは、時間の経過とともに新しいフィールドをタイプに追加するときに適用されるのと同じルールであることに注意してください。)Foo
Bar
Bar
Foo
id
Foo
Bar
id
これを使用して、「スーパークラス」のフィールドのコピーをすべて含むいくつかの型を持つことにより、継承のようなものを実装できます。ただし、このアプローチにはいくつかの大きな問題があります。
Foo
はBar
、シリアル化して再解析する必要があります。ただキャストすることはできません。これは非効率的です。Protocol Buffer Basicsチュートリアルを参照してください。
ただし、クラス継承に似た機能を探しに行かないでください。プロトコル バッファはそれを行いません。