Как реализовать ООП для вызова метода экземпляра из одного класса, который будет сохранен в массиве в другом методе экземпляра в другом классе?

Для дальнейшего понимания моего вопроса:

У меня есть проблема, над которой я работаю в моем учебнике по Java, в котором мне предлагается написать класс с именем GroceryList, представляющий список товаров для покупки на рынке, а также другой класс с именем GroceryItemOrder, который представляет запрос на покупку определенного товара. в данном количестве (например: четыре единицы апельсинов). По дальнейшим инструкциям я должен разработать клиент, который тестирует и печатает результаты всех реализованных методов.

Отказ от ответственности: я не прошу никого делать эту проблему для меня. Я только пытаюсь попросить наставника уточнить, как я могу реализовать метод экземпляра из моего класса GroceryItemOrder в мой класс GroceryList по инструкции моего клиента GroceryListClient.

Код из моего класса GroceryList:

public class GroceryList_test {
    public GroceryList_test() {
        GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
    }

    public void add(GroceryItemOrder_test item) {
        GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
        GroceryList[1] = item;
        System.out.println(GroceryList[1]);
    }

    /*public double getTotalCost(GroceryItemOrder_test item) {
    }*/
}

Под методом экземпляра добавьте (элемент GroceryItemOrder_test):

  • Добавляет заданный порядок элементов (как указано GroceryListClient при доступе к классу GroceryItemOrder) в этот список, если в списке менее 10 элементов (не беспокойтесь об этом элементе; я могу сделать это с помощью оператора if и исключения null).

Я хочу, чтобы этот метод загружал порядок элементов из GroceryItemOrder_test (имя строки, целое число, double priceperunit) в массив динамически каждый раз, когда я проинструктировал его сделать это в клиенте GroceryListClient, к которому будет обращаться позже для вычисления общей стоимости в метод экземпляра TotalCost() ниже.

Код из моего класса GroceryItemOrder:

public class GroceryItemOrder_test {
    String itemID;
    int NumberofItems;
    double priceperunit;

    public GroceryItemOrder_test(String name, int quantity, double pricePerUnit) {
        this.itemID = name;
        System.out.println("Item: " + itemID);
        this.NumberofItems = quantity;
        System.out.println("Quantity: " + NumberofItems);
        this.priceperunit = pricePerUnit;
        System.out.println("Price per unit: $" + priceperunit);
    }

    public double getCost() {
        return ((NumberofItems * priceperunit) * 100.0) / 100.0;
    }
    public void setQuantity(int quantity) {
    }
 }

Под общедоступным классом public GroceryItemOrder_test (имя строки, int количество, двойная цена PerUnit):

  • Создает заказ товара для покупки предмета с заданным именем в заданном количестве, который стоит заданной цены за единицу.

Я хочу, чтобы этот метод был загружен в массив в методе добавления экземпляра (элемент GroceryItemOrder_test) из класса GroceryList.

Код из моего клиента GroceryListClient:

public class GroceryListClient {
    public static void main(String[] args) {
        GroceryList_test addorder = new GroceryList_test();
        GroceryItemOrder(addorder);
    }
    public static void GroceryItemOrder(GroceryList_test addorder) {
        GroceryItemOrder_test Oranges = new GroceryItemOrder_test("oranges", 3, 2.46);
        System.out.println("Total cost of " + Oranges.itemID + " = $" + Oranges.getCost());
        addorder.add(Oranges);
        System.out.println();
        GroceryItemOrder_test Grapes = new GroceryItemOrder_test("grapes", 15, 0.55);
        System.out.println("Total cost of " + Grapes.itemID + " = $" + Grapes.getCost());
        addorder.add(Grapes);
    }
 }

По методу GroceryItemOrder(аддор GroceryList_test):

GroceryItemOrder_test Oranges = new GroceryItemOrder_test("oranges", 3, 2.46);
System.out.println("Total cost of " + Oranges.itemID + " = $" + Oranges.getCost());
addorder.add(Oranges);

В частности, заявление addorder.add(апельсины);:

Это должно добавить элемент как "объект", указанный "item", в массив в методе add (GroceryItemOrder_test item).

Это условия, в которых я не могу понять, как выполнять. Пожалуйста, помогите, если это возможно.

НЕ ПРЕДЛАГАЙТЕ ArrayList, потому что я еще не дошел до этого, и после дальнейших исследований я думаю, что он не будет легко работать для этой цели.

1 ответ

Решение

Если я понимаю ваше значение, вы хотите GroceryList хранить разные GroceryItemOrder объекты.

Вы близки к тому, чтобы найти решение в своем коде. Посмотрите здесь, однако:

public void add(GroceryItemOrder_test item) {
    GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
    GroceryList[1] = item;
    System.out.println(GroceryList[1]);
}

Если вы проследите, как это работает, то каждый раз, когда вы вводите add() метод, новый массив будет создан с десятью пустыми элементами. При выходе из метода вы сразу потеряете все ссылки на него, потому что он выйдет из области видимости и, в конце концов, соберет мусор.

Чтобы обойти это, вам нужно использовать переменную, которая остается в области видимости. Я рекомендую переменную экземпляра для вашего GroceryList класс, как это:

public class GroceryList {

    private GroceryItemOrder[] list = null;

    public GroceryList() {
        list = new GroceryItemOrder[10];
    }

    public void add(GroceryItemOrder item) {
        for(int i=0; i<list.length; i++) {
            if(list[i] == null) {
                list[i] = item;
                System.out.println(item);
                break;
            }
        }
    }
}

Сейчас в этом add() Метод, который мы смотрим только на уже существующие и сохраняющиеся list переменная, а не создание новой. Мы перебираем его, чтобы найти свободный слот (если он есть), а затем выполняем оставшуюся обработку. break оператор необходим для того, чтобы каждый элемент в списке не был установлен на тот элемент, который вы добавляете.

Тогда ваш GroceryClient класс может создать GroceryItemOrder объекты, как это угодно, и использовать add() метод из GroceryList (потому что это public).

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

Другие вопросы по тегам