【问题标题】:Java method that can't be callable but can be overridden无法调用但可以覆盖的 Java 方法
【发布时间】:2018-01-30 22:14:22
【问题描述】:

如果我不想调用我的类上的方法,我只需将其设为私有。

但如果我想允许该方法被覆盖,我必须使其受到保护

是否可以在抽象类上有一个不能调用但可以覆盖的方法? (我猜不是,但有什么解决方法吗?)

用例:

abstract class Super {

  protected void finalize() {

  }

  public final void doThings() {
   // do stuff
   finalize();
  }
}

以及想要扩展课程的人:

class Sub extends Super {

  @Override
  protected void finalize() {
    closeSockets();
    alertSomeone();
  }

}

但我不希望其他类调用mySub.finalize()

【问题讨论】:

  • 不能被调用但可以被覆盖....我不明白,你想覆盖一个你不能的方法打电话???
  • 一个可覆盖但不可调用的函数的目的是什么?这有点违背了目的。也许你应该再看看你的设计。
  • OP想要一个在类内部调用的方法,就像private一样,但也是可覆盖的......我认为这是不可能的,好像任何类都可以看到它被覆盖,它也可以看到它调用...
  • 该方法将以模板模式在抽象类中使用。
  • 这整件事有一股难闻的气味......

标签: java inheritance abstract-class visibility


【解决方案1】:

子类可以为超类提供一个包含要执行的代码的 Runnable,而不是覆盖一个方法。你可以这样做:

public class Super {

    private final Runnable subClassCode;

    public Super(Runnable finalizeCode) {
        subClassCode = finalizeCode;
    }

    public final void doThings() {
        // do stuff
        subClassCode.run();
    }

}

public class Sub extends Super {

    public Sub() {
        super(() -> {
            // code to be executed in doThings()
        });
    }

}

您不需要在构造函数中设置 Runnable 实例。您还可以授予对受保护的 setFinalizeCode(Runnable) 方法的访问权限,但该方法也可以由与 Super 相同的包中的其他类调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多