Java:如何显式调用方法的自己的类版本?

马丁·库托

考虑这个 MWE:

public class Base {
  public int myRecursiveAlgo(int a) {
     if (a == 0) { return 0; }
     return a + myRecursiveAlgo(a - 1);
  }
}

public class Child extends Base {
  public int myRecursiveAlgo(int a) {
    return super.myRecursiveAlgo(a) + 1; // modification
  }
}

现在,你看,Child::myRecursiveCall()想要将最终结果调整一。但是,Base::myRecursiveAlgo()现在由于递归调用被分派到Child::myRecursiveAlgo(). 如何Base::myRecursiveAlgo()从 Base 类中显式调用

在 C++ 中,您可以return a + Base::myRecursiveAlgo(a - 1);防止调用子类重写方法的变体。

rzwitserloot

你不能。不可能。

因此,您编写的任何调用您自己的方法之一的代码都需要执行以下操作之一,或者您的代码以尚未可测试的方式被破坏(即等待发生的灾难,非常糟糕):

  • 您将要调用的方法必须是private, 或包私有的,并且有充分的文档记录,以便在同一包中操作的所有人员都知道它所需的属性。

  • 或者,该方法必须 make final,或者您的类需要有效final(如果它是非最终的但所有构造函数都是private,则它实际上是最终的 - 任何重载只能通过在同一源文件中编写子/兄弟姐妹和大概任何人在那里写作是知道条件或至少负责遵守这些条件)。

  • 或者,您的方法将不依赖于它所拥有的任何属性,或者,它所依赖的属性至少已记录在案,并带有一个注意事项。

  • 或者,让您的可覆盖方法是一种单行,将工作转移到不可覆盖的方法(例如私有方法和/或最终方法)。在那里您需要专门锁定到您的基本实现的属性,请调用帮助程序。当然,这本身就令人困惑:据推测,如果有人决定覆盖该方法,那么在某些情况下根本不会调用他们的覆盖是很奇怪的。

第三个(记录它并祈祷)确实存在 - 例如,您可以自由地为某个类编写不一致的 equals/hashCode 算法,然后使用该类的实例作为 HashMap 中的键,但结果将是奇怪的,用各种 Map 彻底撒谎的方法,以及在意想不到的时间发生的奇怪异常。这大概是决定不阅读 equals/hashCode 的合同要求的明灯。

如果必须,您可以做同样的事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java-泛型类的显式方法调用?

如何在不指定类的情况下使用显式类型参数调用Java方法?

显式调用Java中的默认方法

如何显式调用成员函数的const版本?

如何在C#中的基类上调用显式接口方法?

快速调用静态方法:type(of:self)与显式类名

类是否可以在协议扩展上显式调用方法?

如何从动态代理显式调用默认方法?

如何在C ++中显式调用抛出异常的方法?

显式调用extJS类的initComponent

您如何从Clojure在我自己的Java类中调用静态方法?

如何在php中自己的类中调用函数或方法?

如何显式调用内置的shell?

如何显式调用lua gc?

如何从XAML显式调用接口?

没有显式调用的方法的 Java 堆栈帧(调用站点)

在没有显式调用的情况下如何调用'actionPerformed'方法?

您何时需要显式调用超类构造函数?

调用函数错误:类的显式实例

适用于.NET的Python:如何使用同一DLL的不同版本显式创建C#类的实例?

如何在调用自己的植入之前强制继承类的方法实现调用基本方法?

Android StrictMode java.lang.Throwable:未调用显式终止方法“ close”

用于在方法调用中显式指定泛型参数的Java语法

了解Enum类中的Java 7隐式方法调用

如何避免通过pythonnet在python中的IDisposable对象上显式调用Dispose方法?

显式声明默认Java类序列化方法的原因是什么?

如何在Java中显式调用静态初始化器?

glDeleteFramebuffers显式调用

如何从Java类中调用python方法?