麻烦在Java中运行多态数组对象的方法

时间:2015-09-13 04:23:31

标签: java arrays

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

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

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

MultiItemSale中的

Sale[] shoppingCart = new Sale[numOfItems];

根据我的理解,由于DiscountSale扩展销售,销售和折扣销售对象应该能够放在这个数组中,对吗?

我使用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告诉我,"方法setDiscount(double)未定义类型Sale"。如果

shoppingCart[i] = new DiscountSale();

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

1 个答案:

答案 0 :(得分:2)

所有编译器都知道你有Sale个,所以这些是你可以使用的唯一方法。多态性适用于对不同类型的对象进行相同函数调用的情况,并且相同的函数调用将根据它的对象类型而有不同的行为。

在此示例中,name,price和discount可以是构造函数的参数。这样你就可以在说new时传递它们,之后你就不必调用设置方法了。

修改:查看the Wikipedia article on the Circle-Ellipse Problem,我发现任何Sale的隐含折扣为0%。您只能使用DiscountSale并且能够访问其所有成员,可能包括一个标记,指示是否可以更改折扣。