我的程序顶部有一个接口(IVehicle
),下面是一个实现大多数继承方法的类(Vehicle
)。
Vehicle
以下是另外两个类Fueled
和Non-Fuelled
。
Fueled
需要获取/设置/增加fuel
字段的方法,Non-Fulled
不会。
我的问题是,如果不将方法放入界面,当我尝试从我的程序中的其他地方调用它时,Java不会允许它 - 我要么必须投射(我不相信是这里有一个选项,因为我有两种不同类型的Vehicle
)或创建方法。
除了在界面中创建方法之外,还有什么方法可以解决这个问题吗?
如果这是唯一的选择,我将如何处理Non-Fuelled
类中的继承?
答案 0 :(得分:2)
界面的重点在于它代表了一个抽象层次 - 您说"实现此界面的所有类型都支持这些操作。"
这听起来像"改变燃料领域的操作"只是不属于该界面,因为它们并不是所有实现的共同点。使用该接口的代码无法调用这些操作,因为实现可能不支持它们。
你可以施放,如果你真的想:
if (vehicle instanceof Fueled) {
Fueled fueled = (Fueled) vehicle;
// Perform Fueled-specific operations here
}
...但通常(并非总是,但通常)表明您的设计误入歧途,您应该更仔细地考虑它。它将此代码与Fueled
非常紧密地结合在一起。
或者可以将操作添加到IVehicle
(顺便说一句,这不是Java中接口的常规名称),只需使用no-op方法实现它们即可他们没有意义的地方。但这有点像设计气味。 有时它可能是最干净的方法,但要尽量避免它。
(如果没有我们面前的真实设计情况,很难给出具体的建议。)
答案 1 :(得分:2)
我认为你有设计问题。
您应该考虑制作Fueled
和NonFueled
接口,然后通过FueledVehicle
和NonFueledVehicle
具体类实现它们。
根据您希望编码的此层次结构的深度,它可能是字面上的FueledVehicle
和NonFueledVehicle
类扩展抽象Vehicle
并且每个都实现自己的界面或特定模型等。
如本线程中的其他人所述,如果您提供了一些实际代码,将会更容易为您提供帮助。
请注意,作为最后的手段,您总是可以将UnsupportedOperationException
放入不应实现的类的已实现方法中,尽管在这种情况下,这仍然看起来像是一种糟糕的设计。