假设我有一个继承链,其中每个类通过添加一个新字段来扩展其超类,并且我希望该链的每个类都覆盖toString()
方法,如下所示:
public String toString()
{
return super.toString() + "[newfield=" + newfield + "]";
}
如果我使用抽象基类,那么当一个继承链的类通过实现抽象方法变得具体时,从那一点开始,所有子类都将通过继承已经实现的方法变得具体。
在Java中是否有办法迫使每个类重写(重新实现)抽象方法,即使它已经在继承链中实现得更高了?
答案 0 :(得分:3)
简答:不。
答案很长:您可以编写一个单元测试来扫描类路径(使用类似reflections的库),加载抽象类的每个子类并使用反射检查方法。但是在编译时没有办法做到这一点。
除了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集成到您的构建中。
答案 1 :(得分:2)
不,但你可以让你的类实现一个接口而不是抽象的超类。如果类实现了接口,您可以检查编译时间,这取决于您对此类的操作。