3

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

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

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

Java 中有没有办法强制每个类重写(重新实现)抽象方法,即使它已经在继承链中更高层实现?

4

2 回答 2

3

简短的回答:没有。

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

除了 Java, AspectJ有一个hasMethod()切入点,它可以为您进行检查,但不幸的是,这只对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 集成到您的构建中。

于 2012-04-24T13:09:16.583 回答
2

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

于 2012-04-24T13:08:54.883 回答