Dlaczego w Javie nie ma modyfikatora widoczności podklasy?

Niejednokrotnie pragnąłem zmiennej widoczności, która nie jest możliwa w Javie. Chciałem, aby niektórzy członkowie byli widoczni w obrębie ich własnej klasy i podklas, ale nie dla reszty pakietu ani dla reszty świata. Innymi słowy, chciałem tego:

Modifier        Class     Package   Subclass  World
sub-class       Y         N         Y         N

Jednak projektanci Javy dali mi tylko to :

Modifier        Class     Package   Subclass  World
public          Y         Y         Y         Y
protected       Y         Y         Y         N
no modifier     Y         Y         N         N
private         Y         N         N         N

Typowym przypadkiem, kiedy chcę czegoś takiego, jest tworzenie klasy abstrakcyjnej. Sometimes I znajdź abstrakcyjny rodzic potrzebuje dostępu do niektórych członków, ale konkretne dzieci też. Mogę dać im ten dostęp, tworząc członków protected, ale to otwiera dostęp do reszty pakietu, gdy naprawdę nie chcę.

Żeby było jasne, wiem, że taki modyfikator jest a nie możliwy w Javie. Moje pytanie brzmi dlaczego taki modyfikator nie jest zawarty w Javie? Wydaje mi się, że jest to bardziej naturalny poziom widoczności niż protected lub domyślny. Jest powodem tylko wzdłuż linii nie jest wystarczająco ważne, aby być włączone, czy jest to bardziej związane z możliwymi skutkami ubocznymi, które nie brałem pod uwagę?

Author: Michael McGowan, 2011-03-14

3 answers

Przypuszczam, że chcą uniknąć dodatkowej złożoności poprzez posiadanie nieliniowej hierarchii dostępu.

Powinieneś mieć kontrolę nad swoim pakietem, więc po prostu nie wywołaj tam tych chronionych metod.

(nawiasem mówiąc, protected nie jest dokładnie tym samym co sub-class and package, ponieważ niestatyczne metody chronione (jeśli nie są w tym samym pakiecie) nie mogą być wywoływane na dowolnych obiektach klasy deklarującej, ale tylko na obiektach podklasy, w której znajduje się kod. (Można to zobaczyć na Object.clone(), który może być wywołany tylko przez Klasa, której obiekt jest klonowany.))

 17
Author: Paŭlo Ebermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-14 15:03:06

Najwyraźniej uważają bycie-podtypem-of nie za "bliski związek", jak bycie-w-tym-pakiecie-of . A jeśli chodzi o modyfikator, który sugerujesz, nie różniłby się on zbytnio od protected, chyba że podklasa była w innym pakiecie, i powiedziałbym, że bycie w tym samym pakiecie należy uznać za bliższą relację, niż bycie podklasą w zupełnie innym pakiecie.

 6
Author: aioobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-14 18:56:10

Powinieneś umieścić swoją klasę w swoim własnym pakiecie i oznaczyć element (zmienną instancji lub metodę) jako chroniony. W ten sposób żadne inne klasy, z wyjątkiem podklas, nie mogą uzyskać dostępu do tego członka, który sprzedajesz jako chroniony. Skończysz z jedną klasą w jednym pakiecie, jeśli desperacko chcesz, aby tylko podklasy miały dostęp do tego chronionego członka.

 3
Author: Tiberiu Rogojan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-14 15:38:03