#java #inheritance #access-modifiers
#java #наследование #модификаторы доступа
Вопрос:
В Java у меня есть абстрактный класс с реализованным методом (не абстрактным), который я хочу сделать доступным для других классов, которые его расширяют, но не для всех остальных в пакете..
Я думаю, что это невозможно, потому что private сохраняет его закрытым, public и protected слишком сильно его раскрывают..
Как бы вы подошли к проблеме? Повторная реализация одного и того же метода во всех расширенных классах не обсуждается.. есть ли способ получить доступ к родительским методам?
Спасибо!
Ответ №1:
Если вы хотите, чтобы метод был доступен для всего, что расширяет класс, тогда protected
— это нужный вам модификатор. Для этого он и предназначен.
Ответ №2:
but not by everyone else in the package..
Это невозможно. Вы можете использовать protected
access, чтобы разрешить доступ для подклассов, но это также будет включать доступ для каждого класса в одном пакете.
Ответ №3:
Используйте protected и создайте пакет, содержащий только абстрактный класс и его подклассы. Не помещайте в этот пакет никакие другие классы, которые не должны иметь доступа к защищенным методам.
Если вас беспокоит то, что кто-то другой может создать новый класс в этом пакете и начать доступ к защищенным методам, на самом деле не существует языковой конструкции, предотвращающей это. Вы должны либо доверять другим разработчикам, либо пройти строгий процесс экспертной оценки.
Комментарии:
1. Если метод защищен, вам не нужно помещать подклассы в один пакет…
2. @pgras Это верно, но рекомендуется хранить их либо в одном пакете, либо в подпакете, чтобы избежать циклических зависимостей между пакетами.