我获得了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的方法?我认为我对多态和数组的工作方式存在误解。
答案 0 :(得分:2)
所有编译器都知道你有Sale
个,所以这些是你可以使用的唯一方法。多态性适用于对不同类型的对象进行相同函数调用的情况,并且相同的函数调用将根据它的对象类型而有不同的行为。
在此示例中,name,price和discount可以是构造函数的参数。这样你就可以在说new
时传递它们,之后你就不必调用设置方法了。
修改:查看the Wikipedia article on the Circle-Ellipse Problem,我发现任何Sale
的隐含折扣为0%。您只能使用DiscountSale
并且能够访问其所有成员,可能包括一个标记,指示是否可以更改折扣。