В Java, почему метод суперкласса не может получить доступ к защищенным или частным методам/переменным от экземпляра подкласса?

В то время как jenzz anwser работает для простейшего случая. Это не так, если вы перемещаете курсор перед редактированием текста, потому что, как только вторая буква будет напечатана, она будет перемещена в конец EditText.

Предпочитаю использовать это решение:

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) 
            {
                ...
                int position = et_mobile.getSelectionStart();
                et_mobile.setText(f(s));
                et_mobile.setSelection(position);
                ...
            }
7
задан Boann 10 September 2017 в 02:57
поделиться

4 ответа

Это так же просто, как и нарушение инкапсуляции. Другой класс не должен иметь возможности проникнуть в ваш класс и возиться с вещами, даже если вы обобщите этот класс. Откуда, например, Транспортное средство что-то знает об Автомобиле? Вся суть базового класса заключается в предоставлении подклассов, но, как и в случае с чрезмерно защищающим родителем, то, что вы предлагаете, было бы слишком большим.

7
ответ дан 6 December 2019 в 10:53
поделиться

Все дело в наследовании и инкапсуляции.

Правила видимости Java гласят, что

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

Конечно, как вы упомянули, в отражении вы можете изменить правила (если это не запрещает SecurityManager)

4
ответ дан 6 December 2019 в 10:53
поделиться

Я предпочитаю смотреть на это с прагматической и реалистичной точки зрения:

public class Test1 {
    private int a = 1;

    public static void main(String s[]) {
        System.out.println((new Test1()).a);
        System.out.println((new Test1()).getA());
        System.out.println((new Test2()).getA());
    }

    public int getA() { return a; }
}

class Test2 extends Test {
    private int a = 2;

    public int getA() { return a; }
}

Какой синтаксис вы бы предложили Test1 использовать для доступа к закрытому члену a в Test2 . Когда написано Test1 , Test2 может даже не существовать.

Кроме того, базовый класс (суперкласс) не знает, от которого он унаследован. Чтобы базовый класс узнал, когда он был унаследован, вы должны иметь возможность изменять базовый класс при наследовании от него. Вы предлагаете мне как-то изменить мою локальную копию ArrayList , когда я напишу:

class MyArrayList extends ArrayList

И что произойдет в тот день, когда я решу запустить свой код на вашем компьютере, получите ли вы мою измененную копию ] ArrayList , который знает о MyArrayList , или мне как-то изменить копию на вашем компьютере?

Можно ли как-то решить эти проблемы? Безусловно. Есть ли смысл в этом? Я ничего не вижу.

0
ответ дан 6 December 2019 в 10:53
поделиться

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

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

7
ответ дан 6 December 2019 в 10:53
поделиться
Другие вопросы по тегам:

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