Почему мой метод toString () не может правильно переопределить метод toString () в его суперклассе? - PullRequest
0 голосов
/ 06 декабря 2018

Я пишу подкласс с помощью метода toString(), который я хотел бы напечатать, когда элементы этого подкласса читаются в массиве, однако он просто печатает toString() суперкласса, когда элемент этого типадобавлен в массивВот код для подкласса:

package shop;

import java.text.DecimalFormat;

public class MultiBuyProduct extends Product{
private int minDiscountedQuantity;
private int discountPercent;

public MultiBuyProduct(String name, double price, int quantity, int minDiscountedQuantity, int discountPercent) {
    super(name, price, quantity);
    this.minDiscountedQuantity = minDiscountedQuantity;
    this.discountPercent = discountPercent;
}

    //getters and setters

    public double getTotalPrice() {
        if (getQuantity() >= getMinDiscountedQuantity()) {
            double total = getPrice() * getQuantity();
            double discountedTotal = total - ((discountPercent/100) * total); 
            return discountedTotal;
        }
        return getPrice() * getQuantity();
    }

    public double discount() {
        double total = getPrice() * getQuantity();
        double discount = (discountPercent/100) * total;
        return discount;
    }


    @Override
    public String toString() {
        DecimalFormat format = new DecimalFormat("#.00");
        return String.format("%s,\n%20s%5.2f)", super.toString(), format.format(getTotalPrice()), "(Multibuy Discount: GBP ", discount());

    }
}

Это toString в суперклассе Products

public String toString() {
    DecimalFormat format = new DecimalFormat("#.00");
    return String.format("%3d * GBP %5s  %-20s= GBP %7s", quantity, format.format(price), 
                        name, format.format(getTotalPrice()));

}

У меня есть это здесь части класса, который содержит основной метод, ShoppingCart:

public class ShoppingCart {
private ArrayList<Product> cart;

    public ShoppingCart() {
        cart = new ArrayList<>();
    }
    @Override
    public String toString() {
        double total = 0;
        StringBuilder sb = new StringBuilder();
        for (Product p : cart) {
            sb.append(p.toString()).append("\n");
            total += p.getTotalPrice();
        }
        sb.append(String.format("%48s \n%40s%8.2f", "------------", "TOTAL GBP", total));
        return sb.toString();
    }

    public static void main(String[] args) {
        ShoppingCart newCart = new ShoppingCart();

        Product apple, milk, caulk, ice, snakes;
        MultiBuyProduct snakesMulti;
        apple = new Product("Apples (4 pack)", 1.20, 1);
        milk = new Product("Milk (1l)", 0.75, 1);
        caulk = new Product("Caulk (1l)", 6.84, 1);
        ice = new Product("Ice (1kg)", 4.30, 1);
        snakes = new Product("Snake (5m)", 32.0, 1);
        snakesMulti = new MultiBuyProduct("Snakes", 30.0, 12, 3, 20);

        newCart.add(apple);
        newCart.add(apple);
        newCart.add(apple);
        newCart.add(caulk);
        newCart.add(milk);
        newCart.add(milk);
        newCart.add(snakes);
        newCart.add(ice);
        newCart.add(ice);
        newCart.add(snakesMulti);


        System.out.println(newCart);


    }

, который печатает:

  3 * GBP  1.20  Apples (4 pack)     = GBP    3.60
  1 * GBP  6.84  Caulk (1l)          = GBP    6.84
  2 * GBP   .75  Milk (1l)           = GBP    1.50
  1 * GBP 32.00  Snake (5m)          = GBP   32.00
  2 * GBP  4.30  Ice (1kg)           = GBP    8.60
 12 * GBP 30.00  Snakes              = GBP  360.00
                                    ------------ 
                               TOTAL GBP  412.54

, но должен печатать:

  3 * GBP  1.20  Apples (4 pack)     = GBP    3.60
  1 * GBP  6.84  Caulk (1l)          = GBP    6.84
  2 * GBP   .75  Milk (1l)           = GBP    1.50
  1 * GBP 32.00  Snake (5m)          = GBP   32.00
  2 * GBP  4.30  Ice (1kg)           = GBP    8.60
 12 * GBP 30.00  Snakes              = GBP  288.00
       (Multibuy Discount: GBP 72.00
                                    ------------ 
                               TOTAL GBP  340.54

Нужен ли основной метод в MultiBuyProductсам, или я могу использовать один в ShoppingCart?Я могу предоставить больше кода для контекста, если это необходимо.

Редактировать: Я нашел источник проблемы.В ShoppingCart.add() я проверяю элемент, и, если его еще нет в массиве, он создает копию элемента и добавляет его в массив:

public void add(Product p) {
    if (cart.size() > 0) {
        for (Product i : cart) {
            if (i.getName().equals(p.getName()) 
                && i.getPrice() == p.getPrice()) {

                i.setQuantity(i.getQuantity() + p.getQuantity());
                return;
            }
        } 
        cart.add(new Product(p)); //this is done because if it were just cart.add(p), it would change the product being assigned as well as the product in the arraylist
    } else {
        cart.add(new Product(p));
    }
}

Product (p) определяется в Product как

public Product(Product p) {
    this.name = p.name;
    this.price = p.price;
    this.quantity = p.quantity;

}

Это означает, что любые элементы типа MultiBuyProduct теряют свои значения minDiscountedQuantity и discountPercent.Я не уверен, как это исправить, так как я не могу расширить public Product(Product p) до MultiBuyProduct

1 Ответ

0 голосов
/ 06 декабря 2018

Вот пример кода.Пожалуйста, посмотрите, пытается ли это ваше приложение (это поведение)?

В примере есть класс Animal.Dog класс расширяется Animal.Оба имеют переопределенный метод java.lang.Object toString.

class Animal {

    private String name;

    public Animal(String s) {
        name = s;
    }

    public String toString() {
        return "Animal name: " + name;
    }
}

class Dog extends Animal {

    private String name;

    public Dog(String s) {
        super(s);
        name = s;
    }

    public String toString() {
        return "Dog Name: " + name + ", " + super.toString();
    }
}


Public class TestingInheritance {
    public static void main(String [] args) {

        Animal d0 = new Animal("just animal");  
        Animal d1 = new Dog("mutt");
        Dog d2 = new Dog("pup");

        System.out.println(d0);
        System.out.println(d1);
        System.out.println(d2);
        System.out.println("");

        List<Animal>  anims = Arrays.asList(d0, d1, d2);
        for (Animal a : anims) {
            System.out.println(a.toString());
        }
    }
}


Выход:

Animal name: just animal
Dog Name: mutt, Animal name: mutt
Dog Name: pup, Animal name: pup

Animal name: just animal
Dog Name: mutt, Animal name: mutt
Dog Name: pup, Animal name: pup
...