2009-09-12 8 views
5

Я хочу что-то похожее на protected, где только класс, который реализует поле protected и все, что подклассы он может получить к нему.Java: модификатор доступа более ограничительный, чем «защищенный», менее ограничительный, чем «частный»?

Итак, я хочу, чтобы иметь возможность объявлять переменную в базовом классе как private, но все же иметь доступ к ней из подкласса.

Возможно, это противоречит самой природе подкласса, private и/или protected.

Что-то вроде этого существует в Java?

+0

Как правило, разоблачение переменных - плохая идея - даже для подклассов. Есть исключения, но я бы посоветовал вам серьезно подумать, почему вы хотите это сделать. (Я понимаю, что тот же вопрос применим к вызову метода геттера - просто хотел указать на потенциальную проблему). –

ответ

9

Есть только четыре уровня доступа для полей в Java:

  • private
  • пакет-частные (по умолчанию, без модификатора доступа)
  • protected
  • public

protected позволит подклассы, другие классы в том же p ackage и членов класса, чтобы получить доступ к члену protected.

Короткий ответ заключается в том, что достичь желаемого результата невозможно.

Для описания этих четырех модификаторов доступа Controlling Access to Members of a Class от The Java Tutorials имеет более конкретную информацию.

+0

Это неудачно. :( – 2009-09-12 15:51:21

1

Нет, нет access modifier, чтобы сделать именно это. Модификатор protected является самым близким, но предоставляет поле любому классу в том же пакете, а также подклассам (в одном или в одном и том же пакете).

2

Если вы управляете кодовой базой, вы всегда можете контролировать, что входит в пакет с базовым классом - если он один в своем пакете, только подклассы могут получить доступ к члену, который вы хотите сохранить частным, за исключением подклассов.

+0

Это довольно хороший способ обхода. Al-you это не отвечает на вопрос, есть ли такой модификатор (которого нет), но он обеспечивает необходимую функциональность. – PSIXO

0

Невозможно. U все равно может объявить ваши переменные как private, а затем объявить общедоступные методы, которые изменяют переменные в суперклассах. Затем вы вызываете общедоступный метод для переменной.