【问题标题】:Java base class and sub class methods override [closed]Java基类和子类方法覆盖[关闭]
【发布时间】:2013-11-11 19:37:22
【问题描述】:

我是 Java 编程新手,但有一些基本的了解。这是我的问题, 我有一个基类,许多类扩展了这个基类。在某些情况下,经过一个标准 由基类方法执行的操作,我只需要对某些子类执行一些操作。 所以我只是按照以下方式完成。只是想根据 OOPS 检查我是否正确

class BaseClass {

    public void deleteThisRecord() {
        // All standard code goes here
        doSomethingAfterDelete(); // call clean up method after sucessful delete
    }   

    public void doSomethingAfterDelete() {
        // Nothing is here, let the sub class override this if there is need
    }
}

class OneClass extends BaseClass {
    // other methods

    @Override
    public void doSomethingAfterDelete() {
        // do some action after delete
    }
}

【问题讨论】:

  • 如果基类具有默认实现,并且您希望更改某些子类,这将起作用。如果您希望子类被强制拥有它,您可能需要考虑使用抽象类
  • 这个问题对codereview.stackexchange.com 来说更重要,但我认为这样做并没有违法。我有时会这样做,因为它比抽象方法更灵活一些。有时我只想一些子类做点什么。
  • 你可能应该将deleteThisRecord()设为final,这样子类就不会在没有调用doSomethingAfterDelete()的情况下再次实现它。

标签: java base-class


【解决方案1】:

是的,这将以您描述的方式工作,派生类可以选择是否实现doSomethingAfterDelete()。但是,在 Java 中,在派生类中默认可以覆盖基类的所有方法,因此您可能希望在方法 deleteThisRecord() 中添加 final 修饰符以防止它被覆盖:

public final void deleteThisRecord() {
    // All standard code goes here
    doSomethingAfterDelete(); // call clean up method after successful delete
}

【讨论】:

    【解决方案2】:

    抽象方法是只能从子类调用的占位符方法。我建议如果 doSomethingAfterDelete() 是一个打算被覆盖的空占位符方法,你应该把它写成:

    public abstract void doSomethingAfterDelete();
    

    然后在子类中覆盖它。

    【讨论】:

    • 基类也必须声明为抽象类。
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多