【发布时间】:2019-06-01 12:40:48
【问题描述】:
在java中是否可以从基类继承一些方法,但不是全部?为了清楚起见,我将向您展示我的意思: 假设我们有基类 Visitor
public abstract class Visitor {}
我们从访问者创建了另外 2 个对象,客户端和同伴:
public class Client extends Visitor {}
public class Companion extends Visitor {}
在客户端,我们创建方法:
boolean has_Companion() {}
为了实现运行时多态,我们还需要在Visitor中声明方法:
abstract boolean has_Companion();
问题在于,由于我们在 Visitor 中声明了该方法,因此 Companion 也继承了它。我们不希望那样。编译时出现以下错误:
Companion 类型必须实现继承的抽象方法 Visitor.has_Companion()
为 Companion 实现方法 has_Companion() 没有意义,因为它永远不会被使用。这是对代码的浪费。我可以以某种方式避免它吗? has_Companion() 方法只能被Client继承,不能被Companion继承吗?
【问题讨论】:
-
您不必在超类中将方法声明为抽象。或者创建一个接口而不是超类,并让方法在接口中有一个默认实现
-
方法 has_Companion() 是否只能由 Client 继承,而不能由 Companion 继承? 否。有一个
Visitor是没有意义的,其中该方法仅在 一些 子类中可用。 -
您自相矛盾:首先您说要实现多态性,这意味着客户端代码必须能够知道访问者是否有同伴而不知道访问者是客户端还是同伴,并且那么你说 has_Companion() 永远不会在 Companion 上被调用。如果它永远不会在 Companion 上调用,则意味着客户端代码知道访问者是客户端,因此您不需要在访问者中声明它。
-
@JBNizet 我明白了。也许我还没有理解多态的含义。在我的项目中,我有一个访客类型的列表,其中包含客户和同伴。从我的实现中,我知道我什么时候有客户或同伴,但变量是访客类型。我想通过 Visitor 变量调用 has_Companion(),这实际上是一个客户端。这不就是多态吗?
-
当然,但是您怎么知道访问者是客户,而不是同伴?如果你知道,为什么不直接使用
((Client) visitor).hasCompanion()?
标签: java inheritance methods abstract run-time-polymorphism