在Java中...

我正在创建一个包含方法doAction()的Foo类。我的要求:

  • doAction()必须在Foo中具有默认实现(即函数主体)。
  • Foo的所有子类都必须重写doAction(),这意味着如果子类不提供新的实现,则它们将获得编译器错误。
  • 我需要能够实例化Foo。

  • 抽象将起作用,除了它不允许我为doAction()指定函数体。

    最佳答案

    编辑
    故事的结尾不可能同时满足所有要求。您必须至少放弃一个条件,并可能考虑采用完全不同的方法来解决您要解决的问题。

    使用两种单独的方法。要么:

    abstract class Foo {
    
        // Override this method
        abstract void doActionInSubclass();
    
        // You can't override a final method
        // And you don't want subclases to override this one
        final void doAction () {
            // do whatever default-y things you want here
            doActionInSubclass();
        }
    }
    
    或者只是使“required”方法与您要强制子类重写的方法完全分开:
    abstract class Foo {
        abstract void mustOverrideThisInConcreteSubclasses();
    
        final void doAction() {
            // default-y things here
        }
    }
    

    07-28 13:06