分配给我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/