多态性java循环错误

时间:2016-01-09 17:56:19

标签: java loops polymorphism

我在循环内遇到多态调用问题。

我有一个名为Item的抽象类,它有两个子类ClothingItemSportItem以及一个名为printBudgetGST(Items[] item)的抽象方法,用于返回一个具有更新定价的项目字符串包括税。

项目类别:

public abstract class Item 
{
private int code;
private double price;
private boolean isOnGST;

public Item()
{

}
public Item(int code,double price,boolean isOnGST)
{
    this.code = code;
    this.price = price;
    this.isOnGST = isOnGST;
}
public void setGST(boolean isgst)
{
    this.isOnGST = isgst;
}
public int getCode()
{
    return code;
}
public boolean getIsOnGST()
{
    return isOnGST;
}
public double getCurrentPrice()
{
    return price;
}
public String toString() {
    return "Item [code=" + code + ", price=" + price + ", isOnGST=" + isOnGST + "]";
}
public abstract String printBudgetGST(Item[] items);
}

ClothingItem类

public class ClothingItem extends Item 
{
public ClothingItem(){

}
public ClothingItem(int code,double price,boolean isOnGST)
{
    super(code,price,isOnGST);
}
@Override
public String printBudgetGST(Item[] item) 
{
    String stringitem ="";
    for(int i=0;i<item.length;i++)
    {
        if(item[i].getIsOnGST()==true&&item[i].getCurrentPrice()<100.00)
            {
                 double finalprice =(0.06*item[i].getCurrentPrice())+item[i].getCurrentPrice();
                 stringitem = stringitem + " " + "ClothingItem : " + item[i].getCode()+":"+"RM"+finalprice;
            }   
    }

    return stringitem;
}
}

SportsItem类:

public class SportsItem extends Item 
{

public SportsItem(){

}
public SportsItem(int code,double price,boolean isOnGST)
{
    super(code,price,isOnGST);
}
public String printBudgetGST(Item[] item)
{
    String stringitem = "";
    for(int i=0;i<item.length;i++)
    {
            if(item[i].getIsOnGST()==true &&item[i].getCurrentPrice()<150.00)
            {

                 double finalprice =(0.06*item[i].getCurrentPrice())+item[i].getCurrentPrice();
                 stringitem = stringitem + "SportsItem : " + item[i].getCode()+":"+"RM"+finalprice;
            }

    }
    return stringitem;
}
}

测试类:

public class Retail_Item 
{
    private Item[] itemList;
    public Retail_Item()
    {
        itemList = new Item[10];
        itemList[0] = new ClothingItem(10001,85,true);
        itemList[1] = new ClothingItem(10002,150,false);
        itemList[2] = new ClothingItem(10003,168,true);
        itemList[3] = new ClothingItem(10004,43,true);
        itemList[4] = new ClothingItem(10005,162,false);
        itemList[5] = new SportsItem(10006,178,false);
        itemList[6] = new SportsItem(10007,80,true);
        itemList[7] = new SportsItem(10008,191,false);
        itemList[8] = new SportsItem(10009,45,true);
        itemList[9] = new SportsItem(10010,121,true);
    }
    public  void printItem()
    {
        for(int i =0 ;i<itemList.length;i++)
        {

            if(itemList[i].getIsOnGST()==true && itemList[i].printBudgetGST(itemList).length()>0)
            {

                System.out.println(itemList[i].printBudgetGST(itemList));
            }
        }
    }
}


public class TestRetailItem {

    public static void main(String[] args)
    {
        Retail_Item ret = new Retail_Item();
        ret.printItem();

    }

}

输出:

enter image description here 输出应返回税后项目列表(GST)以及更新的定价信息,如下例所示 enter image description here

1 个答案:

答案 0 :(得分:0)

问题在于,您要传递printBudgetGST整个项目数组,并在printBudgetGST的实现中迭代该数组。相反,您应该删除该参数,在printBudgetGST内,您只需在getCurrentPrice()而不是每个getCode()上调用thisitem[i]

此外,您正在检查项目子类中的最高价格(<100或<150),但最好与printItem中的其他检查一起执行此操作。因为最高价格取决于子类(SportsItem vs ClothinItem),我建议您在boolean isOnBudget()中创建一个抽象方法Item,并在这两个子类中相应地实现。

完全修复的代码版本

public abstract class Item {
    private int code;
    private double price;
    private boolean isOnGST;

    public Item()
    {

    }
    public Item(int code,double price,boolean isOnGST)
    {
        this.code = code;
        this.price = price;
        this.isOnGST = isOnGST;
    }
    public void setGST(boolean isgst)
    {
        this.isOnGST = isgst;
    }
    public int getCode()
    {
        return code;
    }
    public boolean getIsOnGST()
    {
        return isOnGST;
    }
    public double getCurrentPrice()
    {
        return price;
    }
    public String toString() {
        return "Item [code=" + code + ", price=" + price + ", isOnGST=" + isOnGST + "]";
    }
    public abstract String printBudgetGST();
    public abstract boolean isOnBudget();
}

class ClothingItem extends Item {
    public ClothingItem() {

    }

    public ClothingItem(int code, double price, boolean isOnGST) {
    super(code, price, isOnGST);
    }

    @Override
    public String printBudgetGST() {
    String stringitem = "";
    double finalprice = (0.06 * getCurrentPrice()) + getCurrentPrice();
    stringitem = stringitem + " " + "ClothingItem : " + getCode() + ":" + "RM" + finalprice;

    return stringitem;
    }

    @Override
    public boolean isOnBudget() {
    return getCurrentPrice() < 100.00;
    }
}

class SportsItem extends Item {
    public SportsItem() {
    }

    public SportsItem(int code, double price, boolean isOnGST) {
    super(code, price, isOnGST);
    }

    public String printBudgetGST() {
    String stringitem = "";
    double finalprice = (0.06 * getCurrentPrice()) + getCurrentPrice();
    stringitem = stringitem + "SportsItem : " + getCode() + ":" + "RM" + finalprice;
    return stringitem;
    }

    @Override
    public boolean isOnBudget() {
    return getCurrentPrice() < 150.00;
    }
}

class Retail_Item
{
    private Item[] itemList;

    public Retail_Item()
    {
    itemList = new Item[10];
    itemList[0] = new ClothingItem(10001,85,true);
    itemList[1] = new ClothingItem(10002,150,false);
    itemList[2] = new ClothingItem(10003,168,true);
    itemList[3] = new ClothingItem(10004,43,true);
    itemList[4] = new ClothingItem(10005,162,false);
    itemList[5] = new SportsItem(10006,178,false);
    itemList[6] = new SportsItem(10007,80,true);
    itemList[7] = new SportsItem(10008,191,false);
    itemList[8] = new SportsItem(10009,45,true);
    itemList[9] = new SportsItem(10010,121,true);
    }

    public  void printItem() {
    for(int i =0 ;i<itemList.length;i++) {
        if(itemList[i].getIsOnGST()==true && itemList[i].printBudgetGST().length()>0 && itemList[i].isOnBudget())
        {

        System.out.println(itemList[i].printBudgetGST());
        }
    }
    }
}

class TestRetailItem {
    public static void main(String[] args) {
    Retail_Item ret = new Retail_Item();
    ret.printItem();
    }
}