我想强制子类实现我母类的实现方法。我看这个Java - Force implementation of an implemented method但我无法将我的母班级转换为抽象班级。
public class myMotherClass {
myMethod {
...some code ..
}
}
public class myClass extends myMotherClass {
myMethod {
... other code ...
}
}
所以,在这个例子中,我想强制一个类实现方法。
对不起我的英语不好...
您不能强制子类覆盖方法。您只能通过将其抽象化来强制它实现方法。
因此,如果你不能创建myMotherClass抽象,你只能引入另一个扩展myMotherClass的超类,并委托给必须实现的方法:
public abstract class EnforceImplementation extends myMotherClass {
public final void myMethod(){
implementMyMethod();
}
public abstract void implementMyMethod();
}
编辑
我找到了解决hemcrest
api中问题的另一种有效的方法,例如由mockito使用。
public interface Matcher<T> extends SelfDescribing {
/**
* Evaluates the matcher for argument <var>item</var>.
* <p/>
* This method matches against Object, instead of the generic type T. This is
* because the caller of the Matcher does not know at runtime what the type is
* (because of type erasure with Java generics). It is down to the implementations
* to check the correct type.
*
* @param item the object against which the matcher is evaluated.
* @return <code>true</code> if <var>item</var> matches, otherwise <code>false</code>.
*
* @see BaseMatcher
*/
boolean matches(Object item);
/**
* This method simply acts a friendly reminder not to implement Matcher directly and
* instead extend BaseMatcher. It's easy to ignore JavaDoc, but a bit harder to ignore
* compile errors .
*
* @see Matcher for reasons why.
* @see BaseMatcher
*/
void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}
接口指定方法_dont_implement_Matcher___instead_extend_BaseMatcher_
。当然,它不会阻止其他人实现Matcher
界面,但它会引导开发人员朝着正确的方向前进。
并且BaseMatcher
类将_dont_implement_Matcher___instead_extend_BaseMatcher_
方法实现为final
public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
// See Matcher interface for an explanation of this method.
}
最后我认为这是一个设计问题,因为BaseMatcher
显然实现了每个Matcher
应该实现的逻辑。因此,将Matcher
作为抽象类并使用模板方法会更好。
但我猜他们这样做是因为它是字节码兼容性和新功能之间的最佳折衷方案。
您可以重新设计层次结构,以便您的具体类只是树的叶子。
代替
myClass extends myMotherClass
考虑
myClass extends myMotherAbstractClass
myMotherClass extends myMotherAbstractClass
这样,Abstract类由两个实例化的类继承。在这种情况下,myMotherClass
可能会非常薄,只需要执行myMethod
。
大多数人忽视的一件事是以下实现(尽管我在评论中看到了它):
public class MyMotherClass {
public void myMethod() {
throw new RuntimeException("Method not overwritten");
}
}
在大多数情况下,这应该足够了,因为您应该进行某种形式的验收测试(即使它只是手动测试继承类)。从理论上讲,你仍然会提到这样一种可能性,即没有人会意识到这种方法在生产之前并没有被覆盖。
如果你真的想强制实现方法使用应该使用interface
。
public interface MyInterface{
void myMethod();
}
现在,如果有人希望从这个界面实现MyClass implements MyInterface
,你必须实现myMethod();
public MyClass implements MyInterface{
public void myMethod{
// do something
}
}