#java #oop #inheritance
#java #ооп #наследование
Вопрос:
Я хочу присвоить basePrice (который является унаследованным полем от класса Hamburger) переменной double NewPrice внутри перезаписанного метода AddItems() . Это не было проблемой в суперклассе, поскольку поле существовало. Я просто набрал «double NewPrice = this.basePrice;». Но это не работает в подклассе. Я новичок в программировании, любая помощь приветствуется.
public class HealthyBurger extends Hamburger{
public HealthyBurger(String meat, double basePrice) {
super("Healthy Burger", "brown rye", meat, basePrice);
}
public void addItems() {
double newPrice = ???HOW TO ASSISGN basePrice HERE???;
}
}
Комментарии:
1. Это зависит
basePrice
от того, является ли оно закрытым или для него есть метод установки.
Ответ №1:
Для доступа this.basePrice
из производного класса basePrice
атрибут должен быть protected
в базовом классе.
Затем вы можете сделать:
this.basePrice = ...; // whatever you want here
Комментарии:
1. Это действительно решило мою проблему, в курсе, который я просматриваю, до сих пор не упоминается защищенное ключевое слово, думал, я видел его здесь и там. Большое спасибо.
Ответ №2:
Скорее всего, существует метод getBasePrice()
, который вы должны вызвать:
this.getBasePrice();
// instead of
this.basePrice;
Если его нет, перейдите к исходному коду Hamburger ( Hamburger.java
) и добавьте этот метод.
Объяснение
Если вы получаете сообщение об ошибке при записи this.basePrice
в свой HealthyBurger
класс, это означает, что поле в Hamburger
классе либо помечено как private
или, либо [1] находится в другом пакете, а [2] было объявлено без модификатора доступа (что является java-ese для концепции, называемой package private, что означает, к нему могут прикасаться только вещи внутри пакета, а вас там нет).
Одно из исправлений состоит в том, чтобы перейти к исходному коду Hamburger.java
и создать его protected
вместо этого (что означает: любой исходный код в этом файле, все классы в одном пакете и любые подклассы — и этот последний откроет вам двери), но более идиоматично java делать поля закрытыми,поэтому оставьте все как есть и создайте этот метод, который называется «получателем» и, вероятно, должен быть public
.
ПРИМЕЧАНИЕ: Если вам кажется утомительным писать их, всегда есть Lombok .
Ответ №3:
Вы можете просто создать getBasePrice()
метод, определенный в родительском классе, или просто объявить поле:
protected double basePrice
и вы можете просто назначить double newPrice = this.basePrice;
Комментарии:
1. тогда с чем
getBasePrice()
?2. @Pierre Разумнее объявить поле с модификатором protected, но если он по какой-то причине не может этого сделать, он может создать метод getBasePrice() для доступа к значению этого экземпляра