要求覆盖非抽象类的特定方法

时间:2013-01-11 05:05:14

标签: java inheritance methods

是否可以将类定义为

public class MyClass
{
    public void methodA(){} // Inherit
    public void methodB(){} // Inherit
    public void methodC(){} // Require override
}

然后让所有从MyClass扩展的类需要覆盖methodC()但只是简单地继承methodA()methodB()

如果有可能,怎么做呢?如果不可能,您能否提出替代解决方案以获得类似的结果?

编辑:

我需要一个非抽象类,因为我希望能够实例化这个类。

7 个答案:

答案 0 :(得分:14)

你必须使你的基类抽象化。

public abstract class MyClass
{
    public void methodA(){} // Inherit
    public void methodB(){} // Inherit
    public abstract void methodC(); // Require override
}

答案 1 :(得分:9)

您不能要求覆盖非抽象方法。

也许你可以做类似于template method pattern

的事情
 public final void methodC() { methodC1(); someMoreLogic(); methodC2();}

 protected abstract void methodC1();

 protected abstract void methodC2();

这里methodC封装了一个固定的算法,该算法调用必须由子类提供的片段。

答案 2 :(得分:2)

我不认为你完全按照自己的意愿行事。或者,将MyBaseClass创建为具有methodC()和methodB()的methodA()抽象实现的抽象类。从中导出MyClass,为methodC()添加实现。任何你不想继承该实现的类都应该直接子类化MyBaseClass而不是MyClass。

答案 3 :(得分:2)

如果您希望方法只是继承,请使用final关键字。强制覆盖使其成为abstract。但是,只有非抽象子类才必须覆盖它。

答案 4 :(得分:1)

AFAIK没有办法用Java来强制覆盖Java中的方法。

您可以通过abstract方法获得method as abstract课程。

答案 5 :(得分:0)

一种方法可能是使用虚拟关键字而不是抽象,但不需要覆盖,但可以覆盖。虽然如此,你可以实例化。

另一种方式,更推荐的是创建一个界面,您可以在其中指明类的要求。它类似于抽象,你指出需要什么,但请记住,界面不是一个类。它更像是指针。有关界面点击的更多信息:https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

答案 6 :(得分:0)

所以,java.lang.Thread 是一个具体的类,它实现了 Runnable 接口。所以,一定是Thread实现了一个public void run()方法。但是,当您扩展 Thread 时,例如 MyClass extends Thread { },您需要实现 run() 方法。

有一种方法可以在不使包含类抽象的情况下强制覆盖方法。