Java частный атрибут родителя внутри дочернего конструктора - PullRequest
0 голосов
/ 29 мая 2020

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

public class AdMedia {
private String name;
private int price;

public AdMedia(){}


public AdMedia(String name, int price) {
    this.name = name;
    this.price = price;
}

, который поставляется с publi c getter setter переменных конечно.

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

public class Magazine extends AdMedia {
private int area;
private String position;
private String topics;

public Magazine() {}
public Magazine(String name, int size, String position, String topic){

    super();
    this.size = size;
    this.position = position;
    this.topic = topic;

}

, который также идет с свой собственный getter setter тоже.

Я пытаюсь указать цену внутри конструктора, но конструктор требует переданный параметр. Использование super(name) также уведомляет, что ни один из родительских конструкторов не имеет такой формы.

Это усложняет меня, когда я пытаюсь get name использовать метод родительского класса getName(), который может потребовать некоторого понижающего преобразования. угадайте?

Я пытался найти решение, но большинство требует, чтобы я изменил доступность переменной на protected. Не было бы другого способа сделать это в private?

РЕДАКТИРОВАТЬ: Я забыл упомянуть, что результатом выполнения того, что я написал выше, является невозможность доступа к имени журнала, поэтому, когда я пытаюсь получить имя с понижением, возвращается значение null.

1 Ответ

2 голосов
/ 29 мая 2020

Вы можете написать свой дочерний конструктор как

public Magazine(String name, int size, String position, String topic){
    super();
    setName(name);
    setPrice(100); // 100 is your constant price
    this.size = size;
    this.position = position;
    this.topic = topic;
}

или как

public Magazine(String name, int size, String position, String topic){
    super(name, 100); // 100 is your constant price
    this.size = size;
    this.position = position;
    this.topic = topic;
}

Однако оба способа откроют возможность изменить цену позже:

Magazine m = new Magazine("name", 50, "position", "topic");
m.setPrice(10);

Если вам нужно предотвратить это, вы также должны переопределить установщик setPrice():

public class Magazine extends AdMedia {

    ...
    @Override
    public void setPrice(int price) {
        // what to do here?
        // * you could either silently ignore 
        //   (which might surprise some users expecting to be able to change the price)
        // * throw an UnsupportedOperationException 
        //   (which might surprise other users which are not prepared to handle such an exception)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...