Как реализовать ООП для вызова метода экземпляра из одного класса, который будет сохранен в массиве в другом методе экземпляра в другом классе?
Для дальнейшего понимания моего вопроса:
У меня есть проблема, над которой я работаю в моем учебнике по 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
вопреки тому, что вы говорите в заключительных комментариях вашего поста.