Сложность в сохранении видимости по умолчанию метода, к которому должен обращаться другой пакет - PullRequest
0 голосов
/ 25 ноября 2011

Я разрабатываю MineSweeper . В этом у меня есть 3 пакета. 1.frontEnd 2.backEnd 3.mineSweeperControl.

mineSweeperControl содержит класс ActionSplicer , который реализует ActionListener.In frontEnd У меня есть массив JBUTTONS и массив ActionSplicer объектов , такой что splicerobj [i] [j] прослушивает кнопку [i] [j]. (однозначное соответствие)

backEnd содержит массив объектов, таких как объект [i] [j] имеет подробности фона кнопки [i] [j] , такие как MineValue, isCellEmpty, isCellFlagged и т. Д. ...

Метод doBackgroundAction (i, j) {..} определен в классе BackEndManager . В actionPerformed из ActionSplicer я вызываю doBackgroundAction (i, j) , чтобы любое изменение на переднем плане также влияло на фон.

Где моя проблема?

doBackGroundAction (i, j) должно быть общедоступным, так как оно вызывается в другой упаковке.

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

Я не могу расширить класс BackEndManager, так как я создаю массив объектов ActionSplicer в frontEnd.

Следовательно, мне нужно какое-то руководство по объявлению doBackGroundAction (i, j). Правильный ли способ объявить методы публичными в какой-то неизбежной ситуации? Или Как я могу изменить свой дизайн, чтобы сохранить метод с видимостью по умолчанию.

1 Ответ

0 голосов
/ 25 ноября 2011

Чтобы не показывать этот метод как открытый, у вас может быть что-то вроде этого:

public class BackEndManager {
    protected void doBackgroundAction(int i, int j) { ... }
}

Затем, когда вам понадобится метод, создайте подкласс BackEndManager (так как защищенный позволяет подклассам обращаться к методу):

public class BackEndManagerSubclass extends BackEndManager {
    public void doBackgroundActionNew(int i, int j) {
        doBackgroundAction(i, j);
    }
}

Это сохраняет исходный класс без изменений и позволяет вам открыть новый метод через подкласс, который "скрывает" реальные внутренние элементы класса BackEndManager.

Редактировать : я только что увидел эту строку: «Я не могу расширить класс BackGroundManager, так как я создаю массив объектов ActionSplicer в frontEnd».

Если под BackGroundManager вы подразумеваете BackEndManager, тогда моя идея бесполезна.Не могли бы вы пояснить этот момент?Из того, что я понимаю, ActionSplicer находится в пакете mineSweeperControl, а frontEnd - это другой пакет, так что это за связь с BackEndManager?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...