Частные параметры в публичных методах - PullRequest
4 голосов
/ 31 июля 2011

Ни g ++, ни javac не выдают предупреждений, когда параметры не приватных методов имеют частные типы (например, частные вложенные классы). Такие методы не могут использоваться клиентами, но они могут появляться как часть общедоступного API класса.

В C ++ размещение таких методов в общедоступном разделе класса Foo, например, может позволить другим классам обращаться к этим методам без явного перечисления в качестве друзей внутри класса Foo (при условии, что они могут получить доступ к закрытым типам, используемым как параметры).

Но в целом было бы плохим стилем не делать такие методы явным образом закрытыми или это можно просто игнорировать? (так как клиенты не могут использовать его в любом случае, в чем дело)

Ответы [ 2 ]

4 голосов
/ 31 июля 2011

Это разрешено и может потребоваться.

Хотя вам может быть запрещено создавать переменные закрытого типа; это может быть возвращено функцией. Это позволило бы передавать данные по системе, не сохраняя их в тех частях системы, у которых нет оснований хранить ссылку на нее.

Эта идиома не распространена, но разрешена.

3 голосов
/ 31 июля 2011

Стилистически я должен представить, что использование этих методов как части общедоступного API будет считаться плохим стилем.Вы действительно хотите видеть методы, которые вы не можете вызвать всплывающими подсказками в диалоговом окне автозаполнения вашей IDE при работе с библиотекой?Я так не думаю.

Что касается того, почему нет предупреждений компилятора, в большинстве (возможно, во всех?) Объектно-ориентированных языках (и, конечно, в Java) определяемые пользователем типы объектов просто передаются в методы с использованиемуказатели.Таким образом, для передачи ссылки на него в качестве параметра функции не требуется никаких знаний о фактическом типе, только знание указателей.И что касается компилятора, у каждого есть знания о том, как создать указатель, поэтому у него нет оснований говорить «вы не можете вызывать это внешне».По крайней мере, вы можете назвать его значением null.

...