是否可以将类定义为
public class MyClass
{
public void methodA(){} // Inherit
public void methodB(){} // Inherit
public void methodC(){} // Require override
}
然后让所有从MyClass扩展的类需要覆盖methodC()
但只是简单地继承methodA()
和methodB()
?
如果有可能,怎么做呢?如果不可能,您能否提出替代解决方案以获得类似的结果?
编辑:
我需要一个非抽象类,因为我希望能够实例化这个类。
答案 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() 方法。
有一种方法可以在不使包含类抽象的情况下强制覆盖方法。