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

时间:2013-08-20 09:18:29

标签: java class methods abstract implements

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

public class myMotherClass { 

   myMethod {

      ...some code ..

   }

}

public class myClass extends myMotherClass {

   myMethod {

      ... other code ...
   }

}

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

抱歉我的英文......

4 个答案:

答案 0 :(得分:18)

您不能强制子类覆盖方法。你只能通过将它抽象化来强制它实现一个方法。

因此,如果你不能创建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_方法实现为最终

public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
    // See Matcher interface for an explanation of this method.
}

最后我认为这是一个设计问题,因为BaseMatcher显然实现了每个Matcher应该实现的逻辑。因此,最好将Matcher作为抽象类并使用模板方法。

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

答案 1 :(得分:6)

您可以重新设计层次结构,以便您的具体类只是树的叶子。

而不是

myClass extends myMotherClass

考虑

myClass extends myMotherAbstractClass
myMotherClass extends myMotherAbstractClass 

这样,Abstract类由两个实例化的类继承。在这种情况下,myMotherClass很可能会非常薄,只是myMethod的实现。

答案 2 :(得分:2)

大多数人忽视的一件事是以下实施(虽然我在评论中看到了它):

public class MyMotherClass { 

    public void myMethod() {
      throw new RuntimeException("Method not overwritten");
    }    

}

在大多数情况下,这应该足够了,因为您应该进行某种形式的验收测试(即使它只是手动测试继承类)。从理论上讲,你仍然会提到这样一种可能性,即没有人会意识到这种方法在生产之前并没有被覆盖。

答案 3 :(得分:-1)

如果您真的想强制实施方法,请使用interface

public interface MyInterface{

   void myMethod();
}

现在,如果有人希望从此界面实施MyClass implements MyInterface,您必须实施myMethod();

public MyClass implements MyInterface{

  public void myMethod{
     // do something
   }

}