service Foo {
rpc Bar(FooRequest) returns(FooResponse);
}
virtual void Bar(RpcController* controller, const FooRequest* request,
FooResponse* response, Closure* done);
method引数が暗黙に指定されていることと、request と response が正確な型を指定していることを除き、このメソッドのパラメータは、Service::CallMethod() と同じです。
これらの生成されたメソッドは仮想関数ですが、純粋仮想関数ではありません。 デフォルトの実装は単純にメソッドが未実装であることを示すエラーメッセージで controller->SetFailed() を呼んで、done のコールバックを呼ぶだけです。 あなたの独自のサービスを実装するときは、この生成されたサービスのサブクラスを作り、メソッドを適切に実装しなければなりません。
プロトコルバッファコンパイラは、全てのサービスインターフェースの「スタブ」実装も生成します。 これは、サービスを実装したサーバーへリクエストを送りたいクライアントで利用されます。 (上記の)Fooサービスには、スタブ実装の Foo_Stub が定義されます。 ネストされたメッセージ型の場合には、Foo_Stub が Foo::Stub としても参照できるように typedef が使われます。
スタブは、チャネルのラッパとして個々のサービスメソッドを追加実装します。 このメソッドの呼び出しは、単に channel->CallMethod() を呼び出します。
プロトコルバッファライブラリは RPC 実装を含んでいません。 ですが、生成されたクラスからあなたの選んだ任意の RPC実装へと中継するのに必要な全ての道具を含んでいます。 あなたは RpcChannel と RpcController の実装を提供する必要があるだけです。詳しい情報は、service.h のドキュメントを見てください。