当前位置: 首页 > 知识库问答 >
问题:

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

燕凯旋
2023-03-14

我想强制子类实现我母亲类的一个实现方法。我看到了一个已实现方法的Java-Force实现,但我无法将我的母类转换为抽象类。

public class myMotherClass { 

   myMethod {

      ...some code ..

   }

}

public class myClass extends myMotherClass {

   myMethod {

      ... other code ...
   }

}

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

抱歉我的英语...

共有3个答案

江迪
2023-03-14

大多数人忽视的一件事是以下实现(尽管我在评论中提到了它):

public class MyMotherClass { 

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

}

在大多数情况下,这应该足够了,因为您应该有某种形式的验收测试(即使只是手工测试继承类)。从理论上讲,你仍然在引入一种可能性,即没有人会意识到这种方法直到生产时才被过度使用。

林英锐
2023-03-14

你可以修改你的层次结构,使你的具体类只是树的一部分。

而不是

myClass extends myMotherClass

考虑

myClass extends myMotherAbstractClass
myMotherClass extends myMotherAbstractClass 

这样抽象类就被两个实例化类继承了。在这种情况下,myMotherClass可能会非常薄,只是myMethod的实现。

韦业
2023-03-14

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

因此,如果您不能使myMotherClass抽象,您只能引入另一个超类来扩展myMotherClass并委托给必须实现的方法:

public abstract class EnforceImplementation extends myMotherClass {

        public final void myMethod(){
             implementMyMethod();
        }

        public abstract void implementMyMethod();
}

编辑

我在mockito使用的hemcrestapi中找到了另一种解决问题的有趣方法。

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类实现了\u dont\u implement\u Matcher\uuuuuuuuuuuuuuuuu而不是作为final的扩展\u BaseMatcher\uuuuu方法

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

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

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

 类似资料:
  • 问题内容: 如果我要使用DefaultServeMux(我将其指定为ListenAndServe的第二个参数来指定),那么我可以访问,您可以在Go Wiki的以下示例中看到该: 在当前代码中,我无法使用DefaultServeMux,即我将自定义处理程序传递给ListenAndServe 因此,我没有内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码。例如,如果我一直在使用Defaul

  • 下面是解释我的情况的基本框架代码。 这是超级抽象类: 这是超级抽象类的一个子类:(注意,我删除了其他函数,比如构造函数和方法,以缩短文章的篇幅 我想在抽象类中使用这种公共无效支付(int金额)方法;然而,超级抽象类Person不会接受支付(付款),因为该方法不在范围内。如何使这个工作? 谢谢~

  • 我最近在浏览SurfaceView的android文档,我发现要获得实际的surface,你必须做以下事情: surface holder的文档在这里:https://developer . Android . com/reference/Android/view/surface holder . html 现在一个SurfaceHolder从getHolder()返回,然后你可以在那个支架上调用

  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边

  • 我的大学教授给我布置了一个练习,内容如下: “Geofence对象是一个对象,它有一个对象集合,可以在这些对象发出信号时等待。有一个add(object)方法,它将对象添加到集合中。还有一个await()方法:它允许等待集合中的任何对象发出信号。每当调用add(object)方法时,await()方法处于活动状态时,add的参数将放入队列中。使用以下接口编写源代码:“。 因此,只有当调用相同数量的

  • 问题内容: 在Django中,当您有一个父类和从其继承的多个子类时,通常可以通过parentclass.childclass1_set或parentclass.childclass2_set访问一个子类,但是如果我不知道我想要的特定子类的名称怎么办? 有没有一种方法可以在不知道子类名称的情况下沿parent-> child方向获取相关对象? 问题答案: (更新:对于Django 1.2及更高版本,