【问题标题】:How to call a BaseClass method through an extended instance如何通过扩展实例调用 BaseClass 方法
【发布时间】:2018-06-28 08:51:11
【问题描述】:

请考虑以下课程:

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

因此,当我从超类 (BaseClass) 调用 this.method3()(或只是 method3())时,将执行 ChildClassmethod3。我知道这是预期的行为,但我只是想知道如何在此设置中仍调用 BaseClass.method3?这可能吗?

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

【问题讨论】:

  • 这是一个答案:stackoverflow.com/a/15674467/32090
  • @BorisPavlović 谢谢,这是一个有趣的解决方案。
  • 我认为评论晚了,但是当我运行上面的程序时,我的 o/p 与你的不同.. code ChildClass.method1 IN BaseClass.method1 IN BaseClass.method3 IN BaseClass.method3 OUT BaseClass .method1 OUT ChildClass.method1 OUT 。 code

标签: java inheritance


【解决方案1】:

一种解决方法是在BaseClass 中创建一个私有方法,然后从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 中发布的解决方案的评论是,如果可能,您不应该这样做。重构您的代码将其分解为更小的函数将是这里的方法。按照这个问题的表述,重构代码是没有问题的。

【讨论】:

  • 您已经更改了问题陈述本身。这是打算签订合同然后实施。
  • @spandey15 不确定您在说什么,我看不出这个答案与 davidxxx 发布的内容有何不同。这可以履行合同,如果需要,我会这样做。
  • @spandey15 在 Java 中,由于覆盖特性,您没有其他解决方案。我在回答中解释了它。所以你必须使用一个技巧。
  • 你也是@davidxxx :)
  • @spandey15 抱歉,我更新答案时没有看到您的编辑。随时再次应用修改
【解决方案2】:

这是可覆盖方法的工作方式:在运行时,运行时对象的方法被调用。
这里this.method3();this 是运行时对象,method3() 是一个可覆盖的方法。所以发生了多态性。

要实现预期的行为,您应该使用不允许覆盖的单个访问修饰符:private
method3() 实现委托给private 方法,现在您可以从method1() 访问它:

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

@Override
public void method3() {
    method3Internal();
}

private void method3Internal() {
    System.out.println("BaseClass.method3 IN");
    System.out.println("BaseClass.method3 OUT");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多