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

Posted

技术标签:

【中文标题】需要覆盖非抽象类的特定方法【英文标题】:Require override of specific methods of a non-abstract class 【发布时间】:2012-12-25 16:09:00 【问题描述】:

是否可以像这样定义一个类

public class MyClass

    public void methodA() // Inherit
    public void methodB() // Inherit
    public void methodC() // Require override

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

如果可能,如何做到这一点?如果不可能,您能否提出一个替代解决方案来达到类似的结果?

编辑:

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

【问题讨论】:

要求重写几乎是抽象方法或类的定义。 我正在考虑这一切;如果我们使用抽象,IDE 和编译会及时帮助我们处理它;但是..我有一个案例,我的代码会变得不必要的复杂和难以阅读......所以我决定在运行时创建限制,在测试应用程序时,所有限制都会弹出阻止它运行;对我来说已经足够好了:) 我们也可以使用运行时多态性覆盖非抽象类。不需要基础抽象类或最终类。 【参考方案1】:

你必须使你的基类抽象。

public abstract class MyClass

    public void methodA() // Inherit
    public void methodB() // Inherit
    public abstract void methodC(); // Require override

【讨论】:

问题中指定类必须是非抽象类。 是的,在问题中,您说“如果不可能,您能否提出替代解决方案”? 这个问题也没有给出任何背景或动机来说明为什么它必须是非抽象的。 好的,我明白你的意思了。只是没有给出明确的答案。我以为你是另一个没有很好地阅读这个问题的人。抱歉,我撤回了我的反对票。【参考方案2】:

您不能要求重写非抽象方法。

也许你可以做类似template method pattern的事情:

 public final void methodC()  methodC1(); someMoreLogic(); methodC2();

 protected abstract void methodC1();

 protected abstract void methodC2();

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

【讨论】:

【参考方案3】:

我不认为你做的正是你想要的。或者,将 MyBaseClass 创建为具有 methodC() 抽象实现的抽象类 methodA() 和 methodB()。从中派生 MyClass,为 methodC() 添加一个实现。任何您不希望继承该实现的类都应直接继承 MyBaseClass 而不是 MyClass。

【讨论】:

【参考方案4】:

如果你想要一个方法被继承使用final关键字。要强制覆盖,请将其设为abstract。但是,只有非抽象子类必须覆盖它。

【讨论】:

OP 编辑​​:我需要一个非抽象类,因为我也希望能够实例化这个类。【参考方案5】:

AFAIK 没有办法在没有抽象的情况下强制覆盖 Java 中的方法。

您可以通过创建method as abstract 方法来使用abstract 类。

【讨论】:

【参考方案6】:

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

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

【讨论】:

Java没有virtual关键字,方法默认是virtual。 final 关键字使方法成为非虚拟方法。【参考方案7】:

所以,java.lang.Thread 是一个实现 Runnable 接口的具体类。因此,一定是 Thread 实现了 public void run() 方法。然而,当你扩展 Thread 时,比如 MyClass extends Thread ,你需要实现 run() 方法。

有一种方法可以强制重写方法而不使包含类抽象。

【讨论】:

以上是关于需要覆盖非抽象类的特定方法的主要内容,如果未能解决你的问题,请参考以下文章

Java基础学习--抽象类与抽象函数

绑定与非绑定方法 继承 继承与抽象 查找属性关系 派生与覆盖 访问父类的内容

设计模式

抽象派生类中的抽象方法覆盖/实现抽象基类的抽象或具体方法。如何以及为啥?

抽象类

java基础之抽象类的介绍