Почему доступ на уровне поля или метода может быть более доступным в подклассе Java - PullRequest
0 голосов
/ 05 октября 2018

Итак, насколько я понимаю, принцип замещения не позволяет подклассу иметь поля, которые имеют более слабые права доступа, поскольку в противном случае он может потенциально нарушать скрытие информации, а также потому, что подкласс должен всегда предлагать, по крайней мере, такое же поведение своегородитель один.Это имеет смысл для меня.
, но в то же время я не понимаю, как может иметь смысл расширять уровень доступа к полю или методу?У меня есть личное поле в родительском классе, в то время как public в дочернем классе.Не могли бы вы привести пример того, почему это имеет смысл?Или это только из-за выбора дизайна?

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

потенциально может нарушить скрытие информации

Скрытие информации, хотя и является хорошей практикой, имеет мало общего с принципом подстановки Лискова.

(A) подкласс должен всегда предлагать, по крайней мере, такое же поведение своего родителя (класса).

Это верно, но это достигается путем запрета модификатора доступа stricter унаследованного члена.A более слабый модификатор доступа отображает дополнительное поведение.

class A {
    private int lastInput;
    protected int getLastInput() {
        return lastInput;
    }
    public int getSquareValue(int input) {
        lastInput = input;
        return getLastInput()*getLastInput();
    }
}

class B extends A {
    public int getLastInput() {
        return super.getLastInput();
    }
}

A aa = new A();
B bb = new B();
A ab = bb;

// All behaviors of A exist in B as well.
// B can be substituted for A.
System.out.println(aa.getSquareValue(5)); // 25
System.out.println(ab.getSquareValue(5)); // 25

// B also has new behaviors that A did not surface.
// This does not prevent B from substituting for A.
System.out.println(bb.getLastInput()); // 5
0 голосов
/ 05 октября 2018

https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html

Родитель и ребенок имеют 2 отдельных экземпляра теста.Как вы можете видеть в этом примере.

public class Main {

    public class Parent{
        private String test = "parent test";

        String getTest() {
            return test;
        }
    }

    public class Child extends Parent {
        public String test = "child test";  // defining it here hides the parent field

        @Override
        String getTest() {
            return test;
        }
    }

    public static void main(String[] args) {
        Main main = new Main();
        Parent parent = main.new Parent();
        System.out.println(parent.getTest());

        Child child = main.new Child();
        System.out.println(child.getTest());
    }
}

Вывод:

parent test
child test
0 голосов
/ 05 октября 2018

это не так, как вы упомянули для частного поля.Вы не можете расширить частное поле от суперкласса до подкласса.если вы объявляете поле с тем же именем, вы определяете новое поле для этого подкласса.
Однако вы можете изменить доступ к пакету и защищенный доступ на что-то более похожее на public, и это не создает никаких проблем, потому что суперкласс не 't для этого подкласса, но подкласс может изменить свое поведение, зависит от его состояния и хочет предоставить это для других пользователей.
Например, когда он защищен, вы можете получить доступ только к этому в этом пакете и в подклассе.однако, возможно, вы делаете некоторые работы, которые не подходят для публичной реализации.(если вы делаете что-то общедоступным, вы должны поддерживать его для будущих выпусков), однако в подклассе вы можете переопределить его и добавить к нему новую функцию и предоставить результат, который будет использоваться другими людьми.
Хороший пример (всегдаjava предоставьте лучший пример):
Если вы видите, java объявил это в классе объекта:

class Object {
    protected native Object clone() throws CloneNotSupportedException;
}

, поэтому никто не может вызвать clone() для него.это хорошо, потому что, возможно, я не хочу предоставлять clone() для моего класса.однако, если я этого захочу, это легко переопределить и сделать его общедоступным для других людей, а также вызвать в нем super.clone() для использования функции, которая была реализована ранее для создания новой копии моего класса.Разве не здорово?!

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