Но я не понимаю, почему private
заявление можно рассматривать как интерфейс.
Частные объявления, как говорят, образуют интерфейс, поскольку у них есть свои собственные клиенты, хотя и не так много, как защищенный или открытый интерфейс класса.
Эти клиенты:
- Сам класс. Очевидно, что вы можете получить доступ к своим членам класса «
private
» из любого статического или нестатического метода любого экземпляра вашего класса.
- Внутренние классы вашего класса. Помните, что внутренние классы вашего класса имеют доступ ко всем членам вашего класса, включая
private
.
- (In C++)Друзья вашего класса.Хотя из цитаты в вашем вопросе, я вижу, что в книге, о которой вы говорите, речь идет о Java, я все равно добавлю этот элемент для полноты, так как ваш вопрос не помечен
java
. В C++ есть ключевое слово friend
, которое позволяет программисту класса назначать некоторые другие классы и/или функции в качестве друзей этого класса. Такие «дружественные» классы и функции имеют доступ ко всем членам класса, включая private
, и поэтому они также являются клиентами частного интерфейса класса.
Таким образом, может быть полезно иметь четко определенный частный интерфейс, поскольку он упрощает и упрощает реализацию методов в вашем классе, его друзьях и внутренних классах для других разработчиков, которые могут работать на вашем классе.
Но все-таки, я нахожу «интерфейс для себя» довольно странно.
Интерфейс сам по себе может быть важен. Вот небольшой мысленный эксперимент.
Представьте, что два разработчика, Алиса и Боб, работают над тем же классом, который называется MissileLauncher
. Боб несет ответственность за реализацию логики для очистки стартовой площадки после запуска ракеты. (Это частный механизм, клиенты открытого или защищенного интерфейса могут не запрашивать очистку пэда - это просто деталь реализации этого класса).
Так, Боб знает, что, чтобы очистить стартовую площадку один имеет декрементировать missleCounter
, установите currentMissle
в null
и вызвать pendingOperations.remove(this.currentOp)
. В коде класса есть только одно место, где это нужно сделать. Боб мог инкапсулировать все это в частный метод под названием clearLaunchingPad()
, но он решил, что логика слишком проста, поэтому он не беспокоился.
Несколько месяцев спустя Алиса обнаруживает, что есть еще один сценарий, в котором необходимо очистить стартовую площадку. Если бы Боб подумал о надлежащем «интерфейсе к себе», Алиса могла бы просто написать вызов this.clearLaunchingPad()
и сделать это через несколько секунд. Но, как мы знаем, Боб не сделал этого. Теперь Алисе нужно пойти и спросить Боб, что ей нужно сделать, чтобы очистить площадку. Но прошло уже несколько месяцев, Боб больше не помнит детали реализации, или, что еще хуже, он может быть уволен с тех пор (и не удивительно, учитывая его культуру кодирования).
Итак, теперь Алисе нужно копать код MissileLauncher
и попытаться выяснить, что ей нужно сделать, надеясь, что у Боба хотя бы порядочность, чтобы прокомментировать его код.
Таким образом, несколько секунд превращаются в несколько часов и несколько возможных ошибок (Алиса может забыть позвонить pendingOperations.remove(this.currentOp)
в конце), так как Боб не обратил внимания на дизайн интерфейса этого класса.
где говорится, что частную декларацию можно рассматривать как интерфейс? –
предложение 'делить интерфейс класса на четыре части' подразумевает, что, не так ли? – UniFreak
Я видел это, я пишу вам ответ, надеюсь, он будет полезен. –