Twoje twierdzenie, że "C++ i Java API mają działać tak samo" są bezpodstawne. Nie są udokumentowane, aby robić to samo. Każdy język wyjściowy może tworzyć inną interpretację struktury opisanej w pliku .proto. Zaletą tego jest to, że to, co dostajesz w każdym języku, jest idiomatic dla tego języka. Minimalizuje uczucie, że jesteś, powiedzmy, "pisanie Javy w C++". Byłoby to z pewnością odczuwane, gdyby istniała osobna klasa Builder dla każdej klasy wiadomości.
dla pola całkowitej foo
, C++ wyjściowy protoc będzie obejmować sposób void set_foo(int32 value)
w klasy dla danego komunikatu.
Wyjście Java zamiast tego generuje dwie klasy. Jeden bezpośrednio reprezentuje komunikat, ale ma tylko przyrostki dla pola. Druga klasa to klasa budowniczych i ma tylko seterów dla pola.
Dane wyjściowe w języku Python są inne. Generowana klasa będzie zawierała pole, które możesz bezpośrednio manipulować. Spodziewam się, że wtyczki dla C, Haskell i Ruby również są całkiem inne. Dopóki wszystkie one mogą reprezentować strukturę, która może być przetłumaczona na równoważne bity na drucie, wykonują swoją pracę.Pamiętaj, że są to "bufory protokołów", a nie "bufory API".
Źródło wtyczki C++ jest dostarczane z dystrybucją protokołu. Jeśli chcesz zmienić typ zwrotu dla funkcji set_foo
, możesz to zrobić. Zwykle staram się unikać odpowiedzi, które polegają na: "Jest to oprogramowanie open source, więc każdy może je modyfikować", ponieważ zwykle nie zaleca się, aby ktoś nauczył się zupełnie nowego projektu na tyle, aby wprowadzić istotne zmiany tylko w celu rozwiązania problemu. Nie sądzę jednak, by w tym przypadku było to bardzo trudne. Najtrudniejszą częścią byłoby znalezienie sekcji kodu, która generuje setery dla pól. Kiedy już to zauważysz, zmiana, której będziesz potrzebować, będzie najprawdopodobniej prosta. Zmień typ zwracania i dodaj instrukcję return *this
na końcu generowanego kodu. Powinieneś wtedy móc napisać kod w stylu podanym w Hrnt's answer.
Myślę, że to prawdopodobnie osobiste preferencje implementatora C++. Konstruktorzy nie są (przynajmniej w moim odczuciu) źle widziani w kodzie C++, i faktycznie używam ich wszędzie tam, gdzie obiekt może mieć) wiele parametrów lub (bardziej prawdopodobne) b) wiele opcjonalnych parametrów. – moswald
Jedną z rzeczy, których nie zauważyłeś w swoim pytaniu, jest to, że klasa Osoba jest niezmienna. –