分配给我2门课:Sale和DiscountSale(扩展了Sale)。我应该创建一个名为MultiItemSale的新类,该类将同时创建Sale和DiscountSale对象的数组(购物车)。但是我无法从DiscountSale获得方法来处理数组中的DiscountSale对象。

Sale类(基类)具有一些方法,特别是setName()和setPrice()。

DiscountSale类扩展了Sale,因此它可以使用setName()和setPrice(),但它还具有setDiscount()等。

在MultiItemSale中:

Sale[] shoppingCart = new Sale[numOfItems];


据我了解,由于DiscountSale扩展了Sale,所以Sale和Discount Sale对象都应该能够放置在此数组中,对吗?

我使用for循环询问是否打折商品。如果不是,则:

shoppingCart[i] = new Sale();


如果打折:

shoppingCart[i] = new DiscountSale();


这是我开始遇到问题的地方:

下面的工作,因为setName()和setPrice()来自Sale类

此外,所有这些都在if语句下,该语句说明项目是否打折,然后:

shoppingCart[i] = new DiscountSale();
shoppingCart[i].setName(name);
shoppingCart[i].setPrice(price);


但是,如果我尝试执行此操作,则会收到错误,因为setDiscount()来自DiscountSale:

shoppingCart[i].setDiscount(discount);


Eclipse告诉我,“对于类型Sale,未定义方法setDiscount(double)”。如果

shoppingCart[i] = new DiscountSale();


为什么不能在该对象上使用DiscountSale中的方法?我认为我对多态和数组的工作方式有误解。

最佳答案

编译器只知道您有Sale,所以这些是您可以使用的唯一方法。当您在不同种类的对象上具有相同的函数调用,并且相同的函数调用根据其属于哪种对象而表现不同时,多态性适用于这种情况。

在此示例中,名称,价格和折扣可能是构造函数的参数。这样,当您说new时就可以传递它们,而后不必调用设置方法。

编辑:看着the Wikipedia article on the Circle-Ellipse Problem,对我来说,任何Sale都有0%的隐式折扣。您只能使用DiscountSale并能够访问其所有成员,可能包括一个标志,该标志指示是否可以更改折扣。

关于java - Java多态数组对象上的麻烦运行方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32546277/

10-09 12:47