gpt4 book ai didi

java - 如何在不使用抽象的情况下强制在子类中实现方法?

转载 作者:太空狗 更新时间:2023-10-29 22:44:54 26 4
gpt4 key购买 nike

我想强制子类实现我母类的一个实现方法。我看这个Java - Force implementation of an implemented method但我无法将我的母类转换为抽象类。

public class myMotherClass { 

myMethod {

...some code ..

}

}

public class myClass extends myMotherClass {

myMethod {

... other code ...
}

}

所以,在这个例子中,我想强制 myClass 实现 myMethod。

对不起我的英语...

最佳答案

您不能强制子类重写方法。您只能通过将其抽象化来强制它实现一个方法。

所以如果你不能使 myMotherClass 抽象,你只能引入另一个父类(super class)来扩展 myMotherClass 并委托(delegate)给必须实现的方法:

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_();
}

接口(interface)指定了一个方法_dont_implement_Matcher___instead_extend_BaseMatcher_。当然这并不妨碍其他人实现Matcher接口(interface),而是为开发者指明了正确的方向。

还有 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 会更好抽象类并使用模板方法。

但我猜他们这样做是因为这是字节码兼容性和新功能之间的最佳折衷。

关于java - 如何在不使用抽象的情况下强制在子类中实现方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18331350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com