从接口继承

时间:2014-03-30 20:55:09

标签: java interface

我的程序顶部有一个接口(IVehicle),下面是一个实现大多数继承方法的类(Vehicle)。

Vehicle以下是另外两个类FueledNon-Fuelled

Fueled需要获取/设置/增加fuel字段的方法,Non-Fulled不会。

我的问题是,如果不将方法放入界面,当我尝试从我的程序中的其他地方调用它时,Java不会允许它 - 我要么必须投射(我不相信是这里有一个选项,因为我有两种不同类型的Vehicle)或创建方法。

除了在界面中创建方法之外,还有什么方法可以解决这个问题吗? 如果这是唯一的选择,我将如何处理Non-Fuelled类中的继承?

2 个答案:

答案 0 :(得分:2)

界面的重点在于它代表了一个抽象层次 - 您说"实现此界面的所有类型都支持这些操作。"

这听起来像"改变燃料领域的操作"只是不属于该界面,因为它们并不是所有实现的共同点。使用该接口的代码无法调用这些操作,因为实现可能不支持它们。

可以施放,如果你真的想:

if (vehicle instanceof Fueled) {
    Fueled fueled = (Fueled) vehicle;
    // Perform Fueled-specific operations here
}

...但通常(并非总是,但通常)表明您的设计误入歧途,您应该更仔细地考虑它。它将此代码与Fueled非常紧密地结合在一起。

或者可以将操作添加到IVehicle(顺便说一句,这不是Java中接口的常规名称),只需使用no-op方法实现它们即可他们没有意义的地方。但这有点像设计气味。 有时它可能是最干净的方法,但要尽量避免它。

(如果没有我们面前的真实设计情况,很难给出具体的建议。)

答案 1 :(得分:2)

我认为你有设计问题。

您应该考虑制作FueledNonFueled接口,然后通过FueledVehicleNonFueledVehicle具体类实现它们。

根据您希望编码的此层次结构的深度,它可能是字面上的FueledVehicleNonFueledVehicle类扩展抽象Vehicle并且每个都实现自己的界面或特定模型等。

如本线程中的其他人所述,如果您提供了一些实际代码,将会更容易为您提供帮助。

请注意,作为最后的手段,您总是可以将UnsupportedOperationException放入不应实现的类的已实现方法中,尽管在这种情况下,这仍然看起来像是一种糟糕的设计。