簡體   English   中英

如何實現OOP來從一個類調用一個實例方法以存儲在另一個類中另一個實例方法的數組中?

[英]How can OOP be implemented to call an instance method from one class to be stored in an array in another instance method in a different class?

為了進一步理解我的問題:

我在Java教科書中正在處理一個問題,它要求我編寫一個名為GroceryList的類,該類表示從市場上購買的商品的列表,還有另一個名為GroceryItemOrder的類,該類表示購買特定商品的請求以給定的數量(例如: 四個橙子 )。 根據進一步的指導,我將開發一個客戶端,以測試並打印所有已實現方法的結果。

免責聲明:我不是要任何人為我做這個問題。 我只是想請一位指導者闡明如何根據客戶GroceryListClient的指令將我的GroceryItemOrder類的實例方法實現到GroceryList類中。

我的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) {
    }*/
}

在實例方法下add(GroceryItemOrder_test item)

  • 如果列表中的項目少於10個,則將給定的項目順序(按GroceryListClient訪問GroceryItemOrder類時的指示 )添加到此列表中( 不必擔心此元素;我可以使用if語句和null異常來完成此操作 )。

我希望此方法每次在GroceryListClient客戶端中指示每次從GroceryItemOrder_test(字符串名稱,整數數量,雙倍priceperunit)將項目訂單動態加載到數組時,稍后將訪問該字段以計算總成本。下面的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(字符串名稱,整數數量,雙倍pricePerUnit)下

  • 構造一個物料訂單,以給定數量的給定名稱購買具有給定名稱的物料,該物料定單價格為給定價格。

我希望將此方法從GroceryList類的實例方法add(GroceryItemOrder_test item)中加載到數組中。

來自我的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 addorder)方法下:

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(Oranges);

這應該將項目作為“項目”指定的“對象” 添加add(GroceryItemOrder_test item)方法下的數組中。

這些是我無法弄清楚如何執行的條件。 請盡可能提供任何幫助。

不要建議使用ArrayList,因為我還沒有這樣做,並且經過進一步的研究,我認為它不能輕松地用於此目的。

如果我理解您的意思,則希望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變量,而不是創建一個新的list變量。 我們遍歷它以找到可用的插槽(如果有),然后執行其余的處理。 break語句是必需的,這樣列表中的每個項目都不會設置為要添加的一項。

然后,您的GroceryClient類可以根據需要創建GroceryItemOrder對象,並使用GroceryListadd()方法(因為它是public )。

請注意,使用ArrayList確實會容易得多,這與您在文章結尾的評論中所說的相反。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM