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

Java 强制继承链的每个类重写抽象方法,java,inheritance,Java,Inheritance,假设我有一个继承链,其中每个类都通过添加一个新字段来扩展其超类,我希望该链的每个类都覆盖toString()方法,如下所示: public String toString() { return super.toString() + "[newfield=" + newfield + "]"; } 如果我使用一个抽象基类,那么当继承链的一个类通过实现抽象方法变得具体时,从那时起,所有的子类也通过继承已经实现的方法变得具体 Java中有没有一种方法可以强制每个类重写(重新实现)抽象方法,即

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

public String toString()
{
    return super.toString() + "[newfield=" + newfield + "]";
}
如果我使用一个抽象基类,那么当继承链的一个类通过实现抽象方法变得具体时,从那时起,所有的子类也通过继承已经实现的方法变得具体


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

没有,但是您可以让类实现一个接口而不是抽象超类。您可以在编译时检查类是否实现了接口,这取决于您对这些类所做的操作。

简短回答:否

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

除了爪哇, 有一个
hasMethod()
切入点,它可以为您执行检查,但不幸的是,这只对
声明父项
建议有效。也许可以使用aspectj分两步完成:

  • 定义一个行为不良的接口
  • 定义一个通知,将此接口分配给从基类扩展而来但没有成员的类
  • 然后为实现此接口的所有类型声明编译错误

    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";
    
    切入点isSubTypeOfYourClass():在(com.your.BaseClass+)内;
    切入点重写方法():hasmethod(public void yourMethodName(..);
    声明父项:isSubTypeOfYourClass()&&!重写方法()
    实现com.yourcompany.illbehable;
    声明错误:isSubTypeOfYourClass()&&在(com.yourcompany.IllBehaved+):
    “实现类必须重写方法”;
    
我还没有测试过这个,但是如果您打开
-XhasMember
选项,它应该可以工作。
在使用Maven、Ant、Eclipse etc.

等标准工具时,可以很容易地将AspectJ集成到您的构建中。您可以在编译时使用注释和自定义注释处理器(如果您考虑编译时间),就可以这样做。@ EliAcherkan Trime,好点。但我想只有在所有重写类上都有注释的情况下,才能这样做,对吗?或者一个标有
@Inherited
的注释就可以了?好问题,我承认我还没有完全想清楚。我希望用注释来标记最顶层的类就足够了,APT允许您a)查找给定类的后代列表;或者b)在所有类上调用注释处理器(以便您可以检查当前类的祖先是否具有特定注释)。@EliAcherkan我很确定a)和b)都不可能。如果您的类没有注释,apt将看不到itI,因为我不知道这一点。因此,也许APT毕竟不是最好的工具:-)