java - 如何通过扩展实例调用 BaseClass 方法

标签 java inheritance

请考虑以下类别:

public interface BaseInterface {

    void method1();
    void method2();
    void method3();
}


public class BaseClass implements BaseInterface {

    @Override
    public void method1() {
        System.out.println("BaseClass.method1 IN");
        this.method3();
        System.out.println("BaseClass.method1 OUT");
    }

    @Override
    public void method2() {
        System.out.println("BaseClass.method2 IN");
        System.out.println("BaseClass.method2 OUT");
    }

    @Override
    public void method3() {
        System.out.println("BaseClass.method3 IN");
        System.out.println("BaseClass.method3 OUT");
    }
}


public class ChildClass extends BaseClass {

    @Override
    public void method1() {
        System.out.println("ChildClass.method1 IN");
        super.method1();
        System.out.println("ChildClass.method1 OUT");
    }

    @Override
    public void method2() {
        System.out.println("ChildClass.method2 IN");
        super.method2();
        System.out.println("ChildClass.method2 OUT");
    }

    @Override
    public void method3() {
        System.out.println("ChildClass.method3 IN");
        System.out.println("ChildClass.method3()");
        System.out.println("ChildClass.method3 OUT");
    }
}

在这种情况下,如果我创建 ChildClass 的实例:

BaseInterface cc1 = new ChildClass();

然后运行 ​​method1这个类的

cc1.method1();

它将返回以下输出:

ChildClass.method1 IN
BaseClass.method1 IN
ChildClass.method3 IN
ChildClass.method3()
ChildClass.method3 OUT
BaseClass.method1 OUT
ChildClass.method1 OUT

所以当我打电话this.method3()时(或只是 method3() )来自父类(super class)( BaseClass ), method3 ChildClass的而是被执行。我知道这是预期的行为,但我只是想知道我怎样才能调用 BaseClass.method3在这个设置中?这可能吗?

请注意,这是一个纯粹的理论问题,我知道实际上我可能应该实例化 BaseClass首先是实例。这是解决这个问题的唯一方法吗?

最佳答案

解决方法是在 BaseClass 中创建一个私有(private)方法,并从 method3 调用该方法,如下所示:

public class BaseClass implements BaseInterface {

    @Override
    public void method1() {
        System.out.println("BaseClass.method1 IN");
        this.internalMethod3();
        System.out.println("BaseClass.method1 OUT");
    }

    @Override
    public void method2() {
        System.out.println("BaseClass.method2 IN");
        System.out.println("BaseClass.method2 OUT");
    }
    private void internalMethod3() {

        System.out.println("BaseClass.method3 IN");
        System.out.println("BaseClass.method3 OUT");
    }

    @Override
    public void method3() {
        this.internalMethod3();
    }
}

会完成同样的事情

还有关于 How to call a superclass method using Java reflection 中发布的解决方案的评论如果可能的话,你不应该这样做。重构代码将其分解为更小的函数将是这里的方法。按照这个问题的表述,重构代码是没有问题的。

关于java - 如何通过扩展实例调用 BaseClass 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48335581/

相关文章:

java - writer.dispose() 未按预期工作

c++ - 为什么在声明派生类时需要将变量设置为基类中的某个值?

c++ - 继承构造函数(使用)和移动

c# - 继承的 Windows 窗体奇怪行为

java - 输入不匹配异常

java - BaseGame Util 无法解析为类型

java - 制作可添加到非索引位置的列表的最佳方法是什么

c++ - 重载方法的类接受模板和基类 - 如何默认某个方法?

python - 不必在 Python 中的类继承中重新定义属性

java - 需要 Mongodb 的帮助 - 使用 "$pull"和 vertx mongoclient 在数组内直接更新文档