2012-06-01 2 views
6

Можно создать дубликат:
How to make data member accessible to class and subclass onlyс ++, как защищенный в Java

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

для например ::

class A 
{ 
    protected void fun() 
    { 
     System.out.println("Hello"); 
    } 
} 
class B 
{ 
    public static void main(String args[]) 
    { 
     A a = new A(); 
     a.fun();   
    } 
} 

здесь, весело A (в) доступна B, даже если B не является подклассом А.

Как можно сделать недоступными для всех классов, не являются подклассом A?

Редактировать: Я хочу достичь этого в java.

+0

это может быть полезно - http://stackoverflow.com/questions/1505010/java-class-whose-fields-are-only-accessible-to-its-subclasses-without-getters-s – FSP

ответ

8

В Java нет способа сделать это.

При этом вы (идеально) управляете всем кодом в своем пакете, поэтому вам просто нужно убедиться, что вы его не используете.

+0

Просто любопытно , существует ли какой-либо механизм, чтобы другие люди просто не объявляли свой код в своем пакете? – matts

+1

@matts См. Ответ Полигнема. Вы можете закрепить свою банку, чтобы предотвратить объявление новых классов в вашем пакете. – Mesop

+1

Сообщается, что http://docs.oracle.com/javase/tutorial/deployment/jar/sealman.html работает. Но отражение позволяет любому коду обойти ограничения видимости, такие как 'private' или protected: нет способа остановить код, который хочет получить ваши внутренние переменные. Итак ... в принципе, вы не можете остановить это, только сделайте его более трудным, что «защищает». –

2

В Java защищенные средства «доступны для наследников и других лиц в одном пакете».

В средствах защиты C++ «доступно по наследству».

Они на самом деле не эквивалентны из-за доступности пакета в Java.

Единственный способ, которым вы можете имитировать защиту на C++ в Java, - это объявление классов в их собственном пакете, но я не рекомендую это делать.

2

В java нет способа сделать это. Защищенное средство, которое является видимым для наследников и классов внутри одного и того же пакета. Но вы можете запечатать свой пакет (http://docs.oracle.com/javase/tutorial/deployment/jar/sealman.html), чтобы никто не мог создавать новые классы в вашем пакете.

 Смежные вопросы

  • Нет связанных вопросов^_^