如何防止子类默认实现超类方法?

时间:2016-10-10 08:04:00

标签: java

我有一个方法可以将对象添加到静态列表中,如下所示:

@PostConstruct
protected void registerToTransactionList() {
    TransactionValidator.registerTransactionList(this);
}

registerTransactionList方法只是将“this”添加到静态列表中,此方法位于BalanceTransactionValidator类中,它扩展了TransactionValidator(静态列表的所有者),问题是{的所有子类{1}}类也被添加到静态列表中,如果我在其中覆盖BalanceTransactionValidator方法,则会这样:

registerToTransactionList

它不会添加子类,但也不会添加@Override @PostConstruct protected void registerToTransactionList() { } 。有人可以帮我这个吗?请注意,默认情况下,子类会覆盖此方法。

2 个答案:

答案 0 :(得分:1)

使方法私有阻止可见性

private void registerToTransactionList() {
}

或使方法最终 to block it from been override

protected final void registerToTransactionList() {
}

答案 1 :(得分:1)

两种方法可以实现这一目标:

  1. 保持你的方法不变;但是,在外部调用该方法之前,您必须主动检查对象的类型
  2. 更改整个逻辑并使该方法私有
  3. 根据其中一条评论中的建议,使方法 final 不会有帮助 - 你的问题不是子类会覆盖那个方法;实质上,您有一个设计问题:您希望子类根本不应该调用该方法。

    所以,这里有意义的唯一真实选项是" 2。"。你看,通过在想要扩展的类上使用公共方法,你隐含地说:调用该方法是完全正确的;在作为基类(或子类!)的实例的任何对象上。

    在你的情况下,事实并非如此:你实际上希望这个方法背后的代码运行于子类。那么你不应该把这个方法放在基类的公共/受保护方法列表中!

    最后:您可能想退后一步,阅读有关优秀OO设计的内容。类层次结构不会从天而降:你故意为某种目的设计它们。换句话说:继承不仅仅是放一些" A扩展B"在你的班级声明。你必须了解B类的每一个方法;以及你的孩子课程应如何处理它们!

    编辑:经过一番思考,我猜你正在做的事情"错误的方式",如:

    class BaseClass {
    
      public final void doRegistration() {
        BaseClass toRegister = getObjectForRegistration();
        if (toRegister != null) { ... register  toRegister ...
      }
    
      protected BaseClass getObjectForRegistration() {
         return null;
      }
    

    使用该代码,您可以输入

     protected BaseClass getObjectForRegistration() {
        if (this instanceof ClassThatShouldBeRegistered) {
          return this;
        } 
        return null;
     }
    

    进入那个想要注册的班级。可能有更好的方法可以做到这一点;但经过一番思考后,我不知道如何避免 instanceof 。但上面的代码应该有效;它只需要在你的基类和那个想要注册的类中的特定代码。