繁体   English   中英

在Java界面中,我怎么能*不*使用从父接口继承的一个特定方法?

[英]In a Java interface, how can I *not* use one particular method inherited from a parent interface?

我有三个接口的层次结构,祖父母,父母和孩子。 父和子有一个方法“添加”,这需要孩子不同的输入参数。 虽然在子项中添加所需的签名没有问题,但是继承的方法将毫无意义 ,那么有没有办法在那里没有它? 其他方法工作正常。

也许,为了实现我想要的,我可以完全改进设计,所以我将简要介绍接口的内容:

我收集由时间和价值组成的仪表读数。 祖父母接口用于单个读取。 我还有一些表示连续读数(一系列)的类,一个包含在同一时间段内运行的多个系列的类(让我们只调用一个表)。

该表可以被视为一个系列(它将值与时间轴正交聚合),并且表和系列都可以被视为单个读数(实现提供不同的聚合方式),因此继承。 这似乎很好,但对于add方法。 (我可以在系列中添加一个单点,但是对于表格,我需要一个额外的参数来告诉我它属于哪个系列。)

不,你不能避免继承一个方法,因为这样做会违反Liskov替换原则

在实践中,你可以让实现抛出UnsupportedOperationException ,但那将是非常讨厌的。

你不能用系列的某种默认值实现继承的方法吗?

也许将所有接口继承断开是有意义的。 只需具体特定类型的行为接口。 无论您实现这些接口的类都可以选择有意义的类,而不必担心实现无意义的方法。

继承的问题在于对语言机制的关注使人们考虑实现而不是语义。

当B继承自A时,它意味着B的每个实例也是A的实例。在OOP中,作为某事物的实例通常意味着您应该对其方法有一个明智的响应并且至少支持它们的消息。

如果你觉得B不应该支持A的一条消息,那么就我而言,你有两个选择:

坏 - 抛出一个“未实现”的异常,就像你对集合框架一样。 但是,这在我看来是糟糕的形式。

好 - 接受B不是A的类型并避免继承或重构它(例如,使用组合和/或接口),这样您就不必重写代码但不使用子类型关系。 如果您的应用程序将随着时间的推移而存在,那么您不希望在层次结构中出现语义问题。

感谢您让我走上正轨,我赞成了我认为最有帮助的帖子。 由于我的解决方案受到帖子的启发,但未发布,我将分享我决定做的事情:

由于层次结构的灵感来自于应该如何查看数据,而在如何添加数据的语义上出现问题,我将把系列和表的接口分别分别设置为读取和写入接口。 写接口彼此无关,读接口可以继承而不会发生冲突。

我会制作这个wiki,以防有人想扩展这个。

你可能想看看Refused Bequest代码的味道。

接口是合同。 这意味着实现该接口的任何东西都必须实现定义的方法。 从技术上讲,你可以将它作为一个虚拟方法实现(没有身体,只需返回,无论如何),但据我所知,它必须实现。

您始终可以将该方法实现为空,例如:

class A implements B{ void add(A) { /*Goes Nowhere Does Nothing*/ return;} }

但实际上,这不是一个好主意。 一个更好的解决方案是所有的祖父母,父母和孩子都是同一个类,有两个额外的方法 - hasParent():boolean和hasChild():boolean。 这样做的好处是可以兼容liskov变量以及更清洁的设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM