message Foo {
extensions 100 to 199;
}
プロトコルバッファコンパイラは、いくつかの Foo の追加メソッドを生成します: HasExtension(), ExtensionSize(), ClearExtension(), GetExtension(), SetExtension(), MutableExtension(), and AddExtension(). これらのメソッドは第一パラメータとして、extensionフィールドを識別する拡張識別子(下で説明します)をとります。 残りのパラメータと返り値は、拡張識別子と同じ型の通常(extensionでない)フィールドから生成した、対応するアクセサメソッドと全く同じになります。 (GetExtension() は特別なプリフィクスのないアクセサに対応します。)
extend Foo {
optional int32 bar = 123;
}
Foo foo; assert(!foo.HasExtension(bar)); foo.SetExtension(bar, 1); assert(foo.HasExtension(bar)); assert(foo.GetExttension(bar) == 1); foo.ClearExtension(bar); assert(!foo.HasExtension(bar));
(拡張識別子の正確な実装は複雑で、魔法のようなテンプレートの使い方をしています。ですが、あなたは拡張識別子がそれをどのように使っているのかに悩む必要はありません。)
message Baz {
extend Foo {
optional Baz foo_ext = 124;
}
}
Foo foo; Baz* baz = foo.MutableExtension(Baz::foo_ext); FillInMyBaz(baz);