Абстрактные методы могут не иметь тела, поэтому ваше определение computeDiscount(...)
должно быть следующим:
abstract void computeDiscount(int count, float itemCost);
В каждом из конкретных классов, расширяющих абстрактный класс, вам нужно будет реализовать этометод.Как правило, абстрактные методы ведут себя подобно методам, определенным в интерфейсах в некоторой степени (они объявлены, но без реализации по умолчанию), но все же имеют различия (могут быть защищены или также закрыты, могут быть реализованы только подклассами и т. Д.).
В большинстве случаев у вас есть абстрактный класс, который предоставляет некоторую логику по умолчанию и просто требует, чтобы подклассы заполняли некоторые "дыры", которые зависят от конкретной реализации.
Таким образом, в основном вы сохраняетепараметры BuyNItemsGetOneFree
и BulkDiscount
в качестве переменных экземпляра и использовать их при вызове computeDiscount(...)
.Вы называете это в конструкторе, который, скорее всего, не в том месте.Я предполагаю, что ваш main должен вызывать метод для объектов, которые вы создаете напрямую, например,
DiscountPolicy bngo = new BuyNItemsGetOneFree(5);
double discountForFour = bngo.computDiscount(4,4.95f);
double discountForFive = bngo.computDiscount(5,4.95f);
Обратите внимание, что ваш computeDiscount(...)
метод должен возвращать значение в соответствии с вашим назначением:
... единственный абстрактный метод computeDiscount, который будет возвращать скидку на покупку заданного количества одного предмета ...
Редактировать:
// Где установить count и itemCost ??
Как я уже говорил выше, вы не «устанавливаете» (сохраняете) их, а используете их только для расчета.