Мне нужна помощь в понимании отношений между абстрактными классами - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть задание, которое я не совсем знаю, с чего начать.Это то, что я должен делать.

  • Создать абстрактный класс DiscountPolicy.Он будет иметь единственный абстрактный метод computeDiscount, который будет возвращать скидку на покупку заданного количества одного предмета.У метода есть два параметра: count (int) и itemCost (float)
  • Извлечь класс BulkDiscount из политики скидок.Он будет иметь конструктор, который имеет два параметра, минимум и процент.Он определит метод computeDiscount, так что, если количество приобретаемых товаров превышает минимальное, скидка является процентом для класса.ComputeDiscount вернет общую скидку.
  • Получите класс BuyNItemsGetOneFree из DiscountPolicy.Класс будет иметь конструктор с одним параметром n.Кроме того, класс определит метод computeDiscount, чтобы каждый n-й элемент был свободным.Например:
  • Если n равно 3, а стоимость предмета равна 10 долларам.На первые 2 товара скидка не предоставляется.Для товаров с 3 по 5 предоставляется скидка в размере 10 долларов США, для 6-го товара - скидка в размере 20 долларов США и т. Д.
  • Для BuyNItemsGetOneFree - метод computeDiscount получит общее количество купленных товаров и стоимость товара, а такжеверните полную скидку, если применимо.
  • В вашей основной программе покажите, что метод computeDiscount работает для классов BulkDiscount и BuyNItemsGetOneFree.

Так я начал его настраивать.Я хочу, чтобы мои методы и параметры находились в правильных местах, и мне интересно, где я определяю параметры, которые мой учитель хочет, чтобы я передал.

public class Ex1012 {
    public static void main(String[] args) {
    // TODO Auto-generated method stub

        DiscountPolicy bulk = new BulkDiscount();

        System.out.println();

        DiscountPolicy bngo = new BuyNItemsGetOneFree();        
    }
}

public abstract class DiscountPolicy {  
    abstract void computeDiscount(int count, float itemCost){

        return discount;
    }
}


public class BuyNItemsGetOneFree extends DiscountPolicy {

    BuyNItemsGetOneFree() { 
    }

    BuyNItemsGetOneFree(int n){
        DiscountPolicy.computeDiscount(int count, float itemCost);
        //set n to a variable here??
        //calculations go here
        //Where to set count and itemCost??
    }   
}

public class BulkDiscount extends DiscountPolicy {

    public BulkDiscount(int minimum, float percent){
        if (quantity > minimum){
            super.ComputeDiscount(int count, float itemCost);
        //calculations go here
            //Where to define count, itemCost, minimum, and percent??
        }       
    }   
}

Я просто беспокоюсь об отношениях между классами исами параметры, потому что я запутался, когда у меня есть несколько классов, таких как эти.Любое понимание будет с благодарностью.Спасибо!

Ответы [ 4 ]

2 голосов
/ 07 сентября 2011

Абстрактные методы могут не иметь тела, поэтому ваше определение 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 ??

Как я уже говорил выше, вы не «устанавливаете» (сохраняете) их, а используете их только для расчета.

1 голос
/ 07 сентября 2011

Вам необходимо рассмотреть, как определять абстрактные методы. Абстрактный метод не имеет тела "{}". Это должно быть определено в подклассах. Подклассы обычно рассчитывают скидку, когда базовый класс вызывает абстрактный метод.

http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

0 голосов
/ 07 сентября 2011

DiscountPolicy - базовый абстрактный класс.Это, в вашем случае, дает структуру для класса, который представляет некоторый тип Discount: все такие классы должны иметь метод computeDiscount, и этот метод будет рассчитывать скидку на основе соответствующих политик.Это контракт, которому должны следовать все классы, представляющие DiscountPolicy.

DiscountPolicy само по себе не дает никакой логики для расчета скидки (без «политики по умолчанию»).Каждый класс должен предоставить свою собственную логику.Вы реализуете его с помощью метода computeDiscount abstract.

Абстрактный метод в Java не имеет никакого тела.Это просто подпись: только контракт (структура) и никакой реализации.

Так что computeDiscount в вашем классе DiscountPolicy должен выглядеть следующим образом (обратите внимание на ; в конце самой подписи. Также нет {}):

abstract float computeDiscount(int count, float itemCost);

Кроме того, этот метод вернет скидку на покупку заданного количества одного предмета , поэтому тип возврата должен быть float, а неvoid

Классы BuyNItemsGetOneFree и BulkDiscount, являющиеся подклассами DiscountPolicy , должны реализовывать метод computeDiscount.Логика в методах computeDiscount этих двух подклассов будет отличаться, в зависимости от логики расчета скидки на оптовую скидку и бесплатной покупки n получить 1 (эта логика приведена в вашем упражнении).

class BulkDiscount extends DiscountPolicy
{
   //Same signature as computeDiscount of DiscountPolicy
   //Not abstract, no semicolon at end of signature, has body. 
   //Also called "Concrete" method
   float computeDiscount(int count, float itemCost)
   {
       //The logic as given in the exercise.
       //Return the discount calculated by the logic
   }
}

Вы тестируете их как (в методе Ex1012, main):

   DiscountPolicy bulk = new BulkDiscount();
   float discount = bulk.computeDiscount(10, 1);  //Data used to test

   DiscountPolicy bngo = new BuyNItemsGetOneFree();  
   float  discount = bngo.computeDiscount()
0 голосов
/ 07 сентября 2011

Во-первых, абстрактные методы не имеют тела.

Во-вторых, поскольку он должен вычислять скидку, он должен возвращать его, так что computeDiscount не может быть недействительным, он должен в вашем случае возвращать float.

Так что DiscountPolicy должна выглядеть как

public abstract class DiscountPolicy {  
  abstract float computeDiscount(int count, float itemCost);
}

Кроме того, вы не можете использовать

DiscountPolicy.computeDiscount(int count, float itemCost);

, поскольку метод computeDiscount не является статическим, он даже не конкретен.

Просто обратите внимание, java - это регистрозависимый язык, поэтому вы должны использовать вещи так, как вы их объявили, computeDiscount и ComputeDiscount - это две разные вещи.

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