Объект не является абстрактным и не переопределяет абстрактный метод - PullRequest
0 голосов
/ 07 февраля 2019

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

Когда я пытаюсь запустить программу для проверки своих классов, я получаю сообщение об ошибке "Cookieне является абстрактным и не абстрагирует метод getPrice() в Dessert публичном классе Cookie extends Dessert. Я получаю ту же ошибку с другим классом под названием Fruit, но она более или менее точно такая же, как Cookie, только с некоторыми другими переменными-членамии имена методов.

Вот суперкласс Dessert:

public abstract class Dessert {

    /** Name of the dessert item. */
    protected final String name;

    /**
     * Constructs a new dessert item.
     * @param name Name of the dessert.
     */
    public Dessert(String name) {
        this.name = name;
    }

    /**
     * Get name of the dessert.
     * @return dessert name
     */
    public final String getName() {
        return name;
    }

    /**
     * Get the price of the dessert.
     * @return Dessert price
     */
    public abstract double getPrice();
}

А вот подкласс Cookie:

public class Cookie extends Dessert {
    private int number;
    private double price;

    public Cookie (String name, int number, double price) {
        super(name);
        this.number = number;
        this.price = price;
    }

    public int getItemCount() {
        return number;
    }

    public double getPricePerDozen() {
        return (price / 12) * number;
    }
} 

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

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Так как Cookie.java расширяет Dessert.java и последний имеет abstract метод, getPrice() Cookie.java должен предоставить определение для него.(Если только он сам не является абстрактным. Это можно было бы сделать, если бы у нас были такие вещи, как OatmealCookie ChocolateChipCookie, который был бы определенным классом.)

Я быстро перепечатал материал из-за проблем с уценкой git и получилэти для компиляции.Я предполагаю, что цена за Cookie должна быть просто ценой за дюжину, и к ней добавлено соответствующее определение:

public abstract class Dessert {

protected final String name;

public Dessert (String name) {
this.name = name;
}

public final String getName() {
  return name;
}
public abstract double getPrice ();
}



public class Cookie extends Dessert {
private int number;
private double price;

public Cookie (String name, int number, double price) {
  super (name);
  this.number = number;
  this.price = price;
}

public int getItemCount() {
  return number;
}

public double getPricePerDozen() {
  return (price/12) * number;
}

public double getPrice() {
  return getPricePerDozen();
}
}
0 голосов
/ 07 февраля 2019

Ваш Dessert класс имеет абстрактный метод double getPrice(), и Cookie расширяет его, поэтому Cookie необходимо реализовать getPrice() или также быть абстрактным, чтобы избавиться от этой ошибки.

Код, очевидно, не компилируется в своем текущем состоянии, но подумайте об этом следующим образом. Если бы нам нужно было создать экземпляр Cookie, его метод double getPrice() наследуется от его суперкласса Dessert, поэтому методсуществует для вызова, но он не имеет реализации ни в Cookie, ни в Dessert, поэтому результат вызова будет неопределенным.Java видит это во время компиляции и поэтому не позволяет вам пытаться сгенерировать некорректный код.

...