Abstract class return

2019-07-30 01:16发布

Sorry if this is something small. I have created an abstract class with some child classes. A controller class creates a object of type abstract class of requested child class type and returns the abstract class implemented. The child classes have specific attributes for them. I can't access those attributes of the returned object since this is of the abstract class default type, so i tried casting. But this give an error "item.Default cannot be cast to item.cloth"

How to fix it?

Code:

public class testMain {

    public void main(int id) {
    Product test;

    switch(ProductController.getCategory(id)) {
    case "Cloth":
        test = (cloth) ProductController.getProduct(id);
        break;
    case "Wear":
        test = (wear) ProductController.getProduct(id);
        break;
    default:
        test = (Default) ProductController.getProduct(id);
    }

    System.out.println("Product No : " + test.ProductNo);
    System.out.println("Title : " + test.Title);
    System.out.println("Description : " + test.Desc);
    System.out.println("Short Description : " + test.ShortDesc);
    System.out.println("Regular Price : " + test.RegularPrice);
    System.out.println("Sale Price : " + test.SalePrice);
    System.out.println("Category : " + test.Category);

    if(((String) test.Category).split(",")[1].contentEquals("cloth")) {
        System.out.println("Size : " + ((cloth) test).size);
        System.out.println("Age : " + ((cloth) test).age);
    }else if(((String) test.Category).split(",")[1].contentEquals("wear")) {
        System.out.println("Brand : " + ((wear) test).Brand);
    }
}
}

public class ProductController {
private static ProductDB prodDB = new ProductDB();

public static Product getProduct(int prodID) {
    Product product;

    List<Object> prodTemp = prodDB.getProductDetails(prodID);
    String Category[] = ((String) prodTemp.get(6)).split(",");

    switch(Category[1]) {
    case "Cloth":
        product = new cloth(...);
        break;
    case "Wear":
        product = new wear(...);
        break;
    default:
        product = new Default(...);
    }

    return product;
}

public static String getCategory(int prodID) {
    return prodDB.getCategory(prodID).split(",")[1];
}
}

public abstract class Product {

public int ProductNo;
public String Title;
public String Desc;
public String ShortDesc;
public float RegularPrice;
public float SalePrice;
public boolean StockStatus;
public String Category;

public void setRegularPrice(float regularPrice) {
    RegularPrice = regularPrice;
    setSalePrice(regularPrice);
}

protected abstract void setSalePrice(float regularPrice2);

public float getSalePrice() {
    return SalePrice;
}

public void setStockStatus(boolean stockStatus) {
    StockStatus = stockStatus;
}

public boolean isInStock() {
    return StockStatus;
}
public Product(int productNo2, String title, String desc, String shortDesc, float regularPrice, boolean stock, String Category) {
    ProductNo = productNo2;
    Title = title;
    Desc = desc;
    ShortDesc = shortDesc;
    setRegularPrice(regularPrice);
    StockStatus = stock;
    this.Category = Category;
}
public Product(int productNo, String title, String desc, String shortDesc) {
    ProductNo = productNo;
    Title = title;
    Desc = desc;
    ShortDesc = shortDesc;
}
public Product(int productNo, String title, String desc, String shortDesc, float regularPrice) {
    ProductNo = productNo;
    Title = title;
    Desc = desc;
    ShortDesc = shortDesc;
    setRegularPrice(regularPrice);
}
}

public class cloth extends Product{
public String size;
public int age;

public cloth(int productNo, String title, String desc, String shortDesc, float regularPrice, boolean stock, String Category, String size, int age) {
    super(productNo, title, desc, shortDesc, regularPrice, stock, Category);
    this.size = size;
    this.age = age;

}

@Override
protected void setSalePrice(float regularPrice2) {
    SalePrice = (float) (regularPrice2 * 0.85);
}

}

1条回答
爷、活的狠高调
2楼-- · 2019-07-30 01:32

You have to put the break after every switch case. If you test this code:

public static void main(String[] args) {

        int test = 2;
        switch (test){
            case 1:
                System.out.println("One");
            case 2:
                System.out.println("Two");
            case 3:
                System.out.println("Three");
            default:
                System.out.println("Default");

        }
}

you will get this output:

Two
Three
Default

So the above code has to be changed like this:

 public static void main(String[] args) {

        int test = 2;
        switch (test){
            case 1:
                System.out.println("One");
                break;
            case 2:
                System.out.println("Two");
                break;
            case 3:
                System.out.println("Three");
                break;
            default:
                System.out.println("Default");

        }
}
查看更多
登录 后发表回答