在Java中继承指定的方法

时间:2019-01-06 18:01:07

标签: java inheritance methods abstract run-time-polymorphism

在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继承吗?

1 个答案:

答案 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
}

然后,必须根据需要更改调用代码以使用类型MightHaveCompanionVisitor。很明显,哪些方法属于什么类型。毫无疑问,在较大的项目中,这样做的工作量会增加,但可能会导致代码更简洁。