在Java中是否可以从基类继承某些方法,但不是全部?为了清楚起见,我将向您展示我的意思: 假设我们有访问者的基类
public abstract class Visitor {}
在访问者中,我们还创建了两个对象,客户端和伴随对象:
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继承吗?
答案 0 :(得分:0)
简短的答案是Java不支持您要尝试执行的操作,但是好消息是有很多解决方法。
想法1 :让Companion
覆盖hasCompanion
并仅总是返回false
。
想法2 :让Visitor
提供了hasCompanion
的实现,该实现只是总是返回false
。然后,客户将使用实际逻辑覆盖hasCompanion
,以确定客户是否有同伴。
想法3 :根本不给hasCompanion
使用Visitor
方法,而只能在Client
中使用该方法。然后,代码通过instanceof
运算符进行运行时类型检查,并通过强制转换在Client
上调用方法。示例:
if (visitor instanceof Client) {
Client client = (Client) visitor;
boolean hasCompanion = client.hasCompanion();
// other logic
}
这充其量是伪造的多态性,而且是一个非常棘手的解决方案。我建议不要这样做。
想法4 :重新考虑设计并重构类型树,以及代码如何使用继承。如果在hasCompanion
上调用Companion extends Visitor
毫无意义,为什么hasCompanion
根本就是Visitor
的方法?
Java不支持多重继承,因此需要接口:
public interface MightHaveCompanion {
public boolean hasCompanion();
}
public abstract class Visitor {
// methods that all Visitors must have
}
public class Client extends Visitor implements MightHaveCompanion {
// overriding implementations of MightHaveCompanion and Visitor methods
}
public class Companion extends Visitor {
// overriding implementations of Visitor methods
}
然后,必须根据需要更改调用代码以使用类型MightHaveCompanion
或Visitor
。很明显,哪些方法属于什么类型。毫无疑问,在较大的项目中,这样做的工作量会增加,但可能会导致代码更简洁。