接口,类和子类的继承

时间:2019-05-06 20:06:35

标签: java

我有一个父类Fruit和子类FruitUnitFruitWeightFruitVolume,描述了如何购买水果的不同类型。

我必须创建一个接口来实现方法payFruit(),因为所有水果子类都必须实现此方法。

interface IFruitPayment {
    double payFruit();
}

假定每个子类的payFruit()计算方法不同(数量*价格,单位*价格,重量*价格),我如何创建任何父Fruit对象并访问该方法子类的payFruit()?

在父类中实现方法payFruit()返回0可以解决此问题,因为子类可以覆盖它,但看起来并不正确。

假设我有一个水果数组列表,我想对其进行迭代以获取方法payFruit()的值。

实现此目标的最佳方式是什么?

简介:

在水果店中,所有水果都有名称和底价。商店以三种方式销售水果:统一,重量和体积。通过将基本价格乘以单位数量,重量或体积(视具体情况而定)来计算总价格。任何类型的水果(例如香蕉,橙子,苹果)都可以按单位,按重量或按体积出售。它旨在开发具有类层次结构的Java项目。 The FruitUnit, FruitWeight and FruitVolume classes inherit from the Fruit class。还应该有一个篮类,代表要购买的各种水果。此类应包含以下方法:

  1. 在购物篮中插入要购买的水果;
  2. 计算购买的水果的总价值;
  3. 计算特定类型水果(水果名称)的总花费

为了与其他项目的类兼容,将执行要在各种类中使用的要支付的金额的计算方法,该方法的名称为payFruit,返回类型为double,并且没有参数。此方法必须在接口中声明。

注意: 我知道这对我来说似乎很特殊,对其他人不是很有帮助,但是我发现使用此类的层次结构有点令人困惑。

3 个答案:

答案 0 :(得分:0)

好吧,所以基本上您希望子类实现chk1接口。

如果每个子类都实现该接口,则可以将它们用作该接口。

IFruitPayment

答案 1 :(得分:0)

您可能正在这里寻找其他结构。很难想象FruitUnit的{​​{1}}子类。这是因为Fruit 不是一种水果。您希望子类实现它是一个单独的接口。

这样说,您可以声明IFruitPayment实现Fruit,使IFruitPaymentFruitUnitFruitWeight extend { {1}}并具有FruitVolume的子类来实现其中之一...

IFruitPayment

除非您需要检查特定的实现类型,否则您应该能够摆脱这三个接口,因为Fruit提供了API。但是否则:

abstract class Fruit implements IFruitPayment {}

实际的子类将实现相应的接口:

IFruitPayment

现在,IMO有一点冗余。如果子接口有理由,也许它们应该拥有自己的更干净的API,例如通过声明特定于其自身类型的方法。这是一个虚构的示例,只是为了说明这个想法:

interface FruitUnit extends IFruitPayment{}
interface FruitWeight extends IFruitPayment{}
interface FruitVolume extends IFruitPayment{}

但除非需要,否则实际上不需要三个子接口。

答案 2 :(得分:0)

要弄清楚一个水果要花多少钱,您实际上有两个问题:

  1. 该水果的“单位”价格
  2. 每个水果的“单位”是多少

核心Fruit(无论是抽象类还是接口)只需提供所有实现都必须实现的double getUnit()。从那里开始,这取决于您要变得多么复杂。如果这只是一个简单的练习,我会考虑添加另外两种方法-一种返回单位价格,另一种获得水果的成本(将它们乘以在一起)。

您可能会争辩说,单位价格并不是Fruit的问题;在这种情况下,您可能有一个完整的其他服务知道每个Fruit的价格,那就是可以进行乘法的服务。

编辑:对于特定的实现,计算其“单位”值时,体积,重量,颜色等都是各自重要的,但取决于您以及情况是否值得在公共界面上使用