繁体   English   中英

调用自己的非覆盖方法

[英]Call own, non-overridden method

假设我有这段代码(实际上不是我的代码,但更容易理解):

public class A {
    private int i1, i2;

    protected int getSum() {
        return i1 + i2;
    }

    protected int getSumTimes10() {
        return getSum() * 10;
    }
}

public class B extends A {

    protected int getSum() {
        throw new UnsupportedOperationException();
    }
}

public class C extends B {

    public void doSomething() {
        // cannot call getSum();
        System.out.println(getSumTimes10());
    }
}

我覆盖了B中的getSum() ,因此任何extends B的类都不能调用它。 但是,我确实需要它B本身。

在任何C上调用doSomething()都会导致UnsupportedOperationException

我怎样才能让A使用它自己的getSum()而不是被覆盖的,这样我就不必两次编写该方法?

语言本身并没有为您提供任何特定的工具来做到这一点。 虽然存在super.someMethod()来调用父级的实现,但没有等效的方法来调用具有您所描述的语义的方法。

在极少数情况下,我认为这是一个理想的设计选择,通常的解决方法是引入一种新方法,可能带有一些任意前缀以使名称与众不同,例如do

public class A {
    private int i1, i2;

    protected int getSum() {
        return doGetSum(); // delegate to non-overrideable version
    }

    protected int getSumTimes10() {
        return doGetSum() * 10; // delegate to non-overrideable version
    }
    
    private int doGetSum() {
        return i1 + i2;
    }
}

您的基类可以依赖do___版本,以防不希望被覆盖的版本并且您永远不必复制实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM