强制继承链的每个类重写抽象方法

时间:2012-04-24 13:07:05

标签: java inheritance

假设我有一个继承链,其中每个类通过添加一个新字段来扩展其超类,并且我希望该链的每个类都覆盖toString()方法,如下所示:

public String toString()
{
    return super.toString() + "[newfield=" + newfield + "]";
}

如果我使用抽象基类,那么当一个继承链的类通过实现抽象方法变得具体时,从那一点开始,所有子类都将通过继承已经实现的方法变得具体。

在Java中是否有办法迫使每个类重写(重新实现)抽象方法,即使它已经在继承链中实现得更高了?

2 个答案:

答案 0 :(得分:3)

简答:不。

答案很长:您可以编写一个单元测试来扫描类路径(使用类似reflections的库),加载抽象类的每个子类并使用反射检查方法。但是在编译时没有办法做到这一点。

除了Java, AspectJhasMethod()切入点,可以为您进行检查,但不幸的是,这只对declare parents建议有效。也许你可以使用aspectj分两步完成:

  • 定义界面IllBehaved
  • 定义一个建议,将此接口分配给从基类扩展但没有成员
  • 的类
  • 然后为实现此接口的所有类型声明编译错误

    pointcut isSubTypeOfYourClass(): within(com.your.BaseClass+);
    pointcut overridesMethod(): hasmethod(public void yourMethodName(..));
    declare parents: isSubTypeOfYourClass() && !overridesMethod()
                     implements com.yourcompany.IllBehaved;
    declare error: isSubTypeOfYourClass() && within(com.yourcompany.IllBehaved+):
                     "Implementation class must override <Foo> method";
    

我没有对此进行测试,但如果您打开-XhasMember选项,它应该可以正常工作。 当您使用Maven,Ant,Eclipse等标准工具时,很容易将aspectj集成到您的构建中。

答案 1 :(得分:2)

不,但你可以让你的类实现一个接口而不是抽象的超类。如果类实现了接口,您可以检查编译时间,这取决于您对此类的操作。