Класс Java, поля которого только доступны для его подклассов (без методов считывания/методов set)?

Походит на лучшее, которое Вы могли сделать, должен выполнить итерации через список, поскольку каждый объект добавляет его к списку "замеченных" объектов или иначе удаляет его из "замеченного", если это уже там, и в конце Ваш список "замеченных" объектов будет включать исключительный элемент. Это - O (n) в отношении времени и n в отношении пространства (в худшем случае, будет намного лучше, если список будет отсортирован).

то, что они - целые числа, действительно не включает в, так как там действительно ли ничто не является особенным, можно ли сделать со складыванием их... там?

Вопрос

я не понимаю, почему выбранный ответ является "лучшим" по любому стандарту. O (N*lgN)> O (N), и это изменяет список (или иначе создает копию его, которая является еще более дорогой в пространстве и времени). Я пропускаю что-то?

5
задан Carl Manaster 1 October 2009 в 17:12
поделиться

6 ответов

Строго говоря, такого модификатора доступа нет. Невозможно объявить поле (или метод / класс, если на то пошло) только доступным для подклассов; наиболее ограничительный модификатор, который вы можете использовать, - это protected , который по-прежнему разрешает доступ к другим классам в пакете родительского класса.

Но кроме этой мелочи, protected - это способ go.

Отредактируйте : чтобы уточнить, что защищенный - это вариант . Для доступа к защищенному методу вы должны быть либо подклассом , либо в одном пакете; вам не обязательно быть обоими. Таким образом, подкласс Command , созданный в другом пакете, по-прежнему сможет получить доступ к (super) .m .

13
ответ дан 18 December 2019 в 06:51
поделиться

Объявить Mediator Med «защищенным», а не частным.

5
ответ дан 18 December 2019 в 06:51
поделиться

вам нужно объявить Mediator m protected в вашем материнском классе.

Более того, в методе exec () вашего подкласса вам нужно выполнить m.doAFoobar () вместо med. doAFoobar (), поскольку med не член, а формальный параметр вашего конструктора.

2
ответ дан 18 December 2019 в 06:51
поделиться
abstract class Command {
    protected Mediator m

    public Command(Mediator med){
        m = med;
    }

    abstract void exec();
}

Класс не является общедоступным, поэтому он может быть расширен только другими классами в том же пакете, а «m» защищен, поэтому к нему могут обращаться производные классы.

1
ответ дан 18 December 2019 в 06:51
поделиться

Если вы дадите med защищенный доступ, он будет доступен подклассам вне пакета.

http://java.sun.com /docs/books/tutorial/java/javaOO/accesscontrol.html

1
ответ дан 18 December 2019 в 06:51
поделиться

Если вы хотите, чтобы поле было доступно только самому классу и любым производным классам и другим классам в этом пакете, используйте ключевое слово protected. Это то, для чего он нужен, и он должен работать даже вне пакета. Вместо того, чтобы вызывать med.doFoobar ();, им нужно вызвать m.doFoobar ();

В качестве альтернативы вы можете создать защищенную (или даже общедоступную) функцию get. Таким образом вы предоставляете возможность получить посредник, но вам не нужно позволять им перезаписывать его после того, как он объявлен.

Однако то, что вы хотите (не может быть прочитано внутри пакета), невозможно в ключевой фразе java. Но, раз уж вы пишете этот конкретный пакет, не могли бы вы просто не получить к нему доступ изнутри пакета? Или создать свой собственный пакет только с этим файлом? Там'

1
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: