Adding subclasses to calculate sales tax?

3k Views Asked by At

Here is the assignment: Account for Items that are not taxed. You sketch the UML diagram below, splitting the Tax class into two subclasses, PercentageTax and NoTax. You have a plan in place, and your supervisor approves, so it is time to implement it. Using the project SaleEvenBetter as a starting point, implement the new design, as described in the UML diagram above. Verify that the tax method within PercentageTax returns the same value as the getPriceWithTax method in the current version of SaleEvenBetter for taxed items, whereas the tax method in NoTax returns a value of zero.

I'm using bluej to compile. The connection of classes is not the problem. I just wanted to know if the code in the subclasses is correct.

Here is what I have so far and below this are the original classes.

    public class PercentageTax extends Tax
    {
    // instance variables - replace the example below with your own

    private String name;
    private double price;
    private Tax tax;

    /**
     * Constructor for objects of class PercentageTax
     */
    public PercentageTax()
    {
        this.name = name;
        this.price = price;
        tax = new Tax();
    }


    public double getPrice()
    {
        return price;
    }


    /**
     * return the price including salesTax
     */
    public double priceWithTax(double price, String state) {
        return price*tax.tax(price, state);
    }

    public class NoTax extends Tax

    // instance variables - replace the example below with your own
     private double price;
     private Tax tax;

    /**
     * Constructor for objects of class NoTax
     */
    public NoTax()
    {
        // initialise instance variables
        this.price = price;
        tax = new Tax();
    }


    public double Notax() 
    {
        return 0;
    }
     /**
     * return the price including salesTax
     */
    public double priceWithNoTax(double price) {
        return price;
    }
}

Original Code:

    public class SalesLine
    {
    private int number;
    private Item item;


    /**
     * Constructor for objects of class SalesLine
     */
    public SalesLine(int number, Item item)
    {
        this.item = item;
        this.number = number;
    }

    /**
     * returns the total sum of the saleline
     */
    public double price(String state)
    {

        return number*item.priceWithTax(state);

    }

    public class Sale
    {
    private ArrayList<SalesLine> saleLines;
    private String state;
    private double price;


    /**
     * Constructor for objects of class SaleBad
     */
    public Sale(String state)
    {
        saleLines = new ArrayList<SalesLine>();
    }
    public Sale()
    {
        saleLines = new ArrayList<SalesLine>();
    }
    /**
     * add an item to the sale
     */
    public void addItem(int number, Item i)
    {
        saleLines.add(new SalesLine(number,i));
    }

    /**
     * return the total of the sale including sales tax for the state
     */
    public double total() 
    {
        double sum = 0;
        for (SalesLine s: saleLines) {
            sum = sum + s.price(state);
        }
        return sum;
    }
}

    public class Item
    {
    private String name;
    private double price;
    private Tax tax;

    /**
     * Constructor for objects of class Item
     */
    public Item(String name, double price)
    {
        this.name = name;
        this.price = price;
        tax = new Tax();
    }

    public double getPrice()
    {
        return price;
    }

    public void setPrice(double newPrice)
    {
        price = newPrice;
    }

    public String getName()
    {
        return name;
    }

    public void setPrice(String newName)
    {
        name = newName;
    }

    /**
     * return the price including salesTax
     */
    public double priceWithTax(String state) {
        return price*tax.tax(price, state);
    }

}

    public class Tax
    {

    /**
     * Constructor for objects of class Tax
     */
    public Tax()
    {

    }

    /**
     * returns the tax for the given amount of money. If the state is unknown, zero is returned
     */
    public double tax(double price, String state) {
        if (state.equals( "NY")) return price * 0.05; else
        if (state.equals( "AL")) return price * 0.07; else
        if (state.equals( "AK")) return price * 0.04; else
        if (state.equals( "AS")) return price * 0.12; else
        if (state.equals( "AZ")) return price * 0.13; else
        if (state.equals( "AR")) return price * 0.08; else
        if (state.equals( "CA")) return price * 0.04; else
        if (state.equals( "CO")) return price * 0.05; else
        if (state.equals( "CT")) return price * 0.07; else
        if (state.equals( "DE")) return price * 0.08; else
        if (state.equals( "DC")) return price * 0.09; else
        if (state.equals( "FM")) return price * 0.17; else
        if (state.equals( "FL")) return price * 0.05; else
        if (state.equals( "GA")) return price * 0.05; else
        if (state.equals( "GU")) return price * 0.05; else
        if (state.equals( "HI")) return price * 0.05; else
        if (state.equals( "ID")) return price * 0.065; else
        if (state.equals( "IL")) return price * 0.05; else
        if (state.equals( "IN")) return price * 0.05; else
        if (state.equals( "IA")) return price * 0.07; else
        if (state.equals( "KS")) return price * 0.07; else
        if (state.equals( "KY")) return price * 0.05; else
        if (state.equals( "LA")) return price * 0.05; else
        if (state.equals( "ME")) return price * 0.098; else
        if (state.equals( "MH")) return price * 0.06; else
        if (state.equals( "MD")) return price * 0.05; else
        if (state.equals( "MA")) return price * 0.04; else
        if (state.equals( "MI")) return price * 0.05; else
        if (state.equals( "MN")) return price * 0.08; else
        if (state.equals( "MS")) return price * 0.05; else
        if (state.equals( "MO")) return price * 0.18; else
        if (state.equals( "MT")) return price * 0.25; else
        if (state.equals( "NE")) return price * 0.05; else
        if (state.equals( "NV")) return price * 0.05; else
        if (state.equals( "NH")) return price * 0.05; else
        if (state.equals( "NJ")) return price * 0.08; else
        if (state.equals( "NM")) return price * 0.07; else
        if (state.equals( "NY")) return price * 0.03; else
        if (state.equals( "NC")) return price * 0.05; else
        if (state.equals( "ND")) return price * 0.06; else
        if (state.equals( "MP")) return price * 0.05; else
        if (state.equals( "OH")) return price * 0.05; else
        if (state.equals( "OK")) return price * 0.09; else
        if (state.equals( "OR")) return price * 0.05; else
        if (state.equals( "PW")) return price * 0.15; else
        if (state.equals( "PA")) return price * 0.05; else
        if (state.equals( "PR")) return price * 0.05; else
        if (state.equals( "RI")) return price * 0.04; else
        if (state.equals( "SC")) return price * 0.05; else
        if (state.equals( "SD")) return price * 0.06; else
        if (state.equals( "TN")) return price * 0.05; else
        if (state.equals( "TX")) return price * 0.07; else
        if (state.equals( "UT")) return price * 0.05; else
        if (state.equals( "VT")) return price * 0.08; else
        if (state.equals( "VI")) return price * 0.05; else
        if (state.equals( "VA")) return price * 0.05; else
        if (state.equals( "WA")) return price * 0.04; else
        if (state.equals( "WV")) return price * 0.06; else
        if (state.equals( "WI")) return price * 0.05; else
        if (state.equals( "WY")) return price * 0.08; 
        // if the state was not found then the prices is returned
        return 0;
    }

}
1

There are 1 best solutions below

2
On

I understood a bit form the code you have given. Here is my implementation, forgive me for spoiling your class names:

class Tax
{

    public double getTax()
    {
        //noTax implementation.
    } 
    public double getTax(String state, double percentageTax)
    {
        //With tax implementation
    }
}


Class WithOutTax extends Tax
{
    //use your no tax method. 
    //use that value to do further manipulation
}

class WithTax extends Tax
{
    //use your with tax method.
    //use that value to do further manipulation
}