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;
}
プロトコルバッファは継承をサポートしていません。代わりに、構成の使用を検討してください。
message Foo {
Bar bar = 1;
string id = 2;
}
しかし、そうは言っても、継承のようなものを使用できるトリックがありますが、これはいハックなので、注意して使用する必要があります。次のようなメッセージタイプを定義する場合:
message Bar {
string name = 1;
}
message Foo {
string name = 1;
string id = 2;
}
Foo
にはBar
のフィールドのスーパーセットが含まれているため、これら2つのタイプはcompatibleです。これは、あるタイプのエンコードされたメッセージがある場合、他のタイプとしてデコードできることを意味します。 Bar
をタイプFoo
としてデコードしようとすると、フィールドid
は設定されません(デフォルト値が取得されます)。 Foo
をタイプBar
としてデコードする場合、フィールドid
は無視されます。 (これらは、時間とともに新しいフィールドを型に追加するときに適用されるルールと同じであることに注意してください。)
これを使用して、「スーパークラス」のフィールドのコピーをすべて含む複数のタイプを持たせることで、継承のようなものを実装できます。ただし、このアプローチにはいくつかの大きな問題があります。
Foo
のメッセージオブジェクトをタイプBar
に変換するには、シリアル化して再解析する必要があります。キャストすることはできません。これは非効率的です。Protocol Buffer Basics チュートリアルを参照してください:
ただし、クラスの継承に似た機能を探しに行かないでください。プロトコルバッファはそうしません。