Java: 如何显式调用自己的类版本的方法?
Java: How to explicitly call the own classes version of a method?
考虑这个 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 class 显式调用 Base::myRecursiveAlgo()
?
在 C++ 中,您可以 return a + Base::myRecursiveAlgo(a - 1);
来防止调用 subclasses 覆盖方法的变体。
你不能。没办法。
因此,您编写的任何调用您自己的方法之一的代码都需要做这些事情之一,或者您的代码以一种尚未可测试的方式被破坏(即灾难等待发生,非常糟糕) :
您将要调用的方法需要是 private
,或者包私有的并且有充分的文档证明所有在同一个包中操作的人都知道它的必需属性。
或者,该方法必须是 final
,或者您的 class 需要有效地 final
(如果它是非最终的,但所有构造函数都是private
,它实际上是最终的——任何重载只能通过在同一个源文件中写入 child/siblings 来发生,并且大概任何在那里写入的人都知道条件或至少负责遵守它们)。
或者,您的方法将不依赖于它所具有的任何属性,或者,它所依赖的属性至少被记录在案,并且买者自负。
或者,让您的可重写方法成为单行代码,将工作外包给不可重写的方法(例如,私有方法 and/or 最后一个)。在您需要专门锁定到您的基本实现的属性的地方,调用帮助程序。当然,这本身就令人困惑:大概如果有人决定重写该方法,那么在某些情况下根本不会调用他们的重写是很奇怪的。
第三个(记录下来并祈祷)确实存在 - 例如,您可以自由地为某些 class 编写不一致的 equals/hashCode 算法,然后使用该 [=44] 的实例=] 作为 HashMap 中的键,但结果将是奇怪的,各种 Map 方法完全撒谎,并且在意想不到的时候出现奇怪的异常。这大概是决定不阅读 equals/hashCode.
合同要求的闪光灯
如果必须的话,你也可以做同样的事情。
考虑这个 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 class 显式调用 Base::myRecursiveAlgo()
?
在 C++ 中,您可以 return a + Base::myRecursiveAlgo(a - 1);
来防止调用 subclasses 覆盖方法的变体。
你不能。没办法。
因此,您编写的任何调用您自己的方法之一的代码都需要做这些事情之一,或者您的代码以一种尚未可测试的方式被破坏(即灾难等待发生,非常糟糕) :
您将要调用的方法需要是
private
,或者包私有的并且有充分的文档证明所有在同一个包中操作的人都知道它的必需属性。或者,该方法必须是
final
,或者您的 class 需要有效地final
(如果它是非最终的,但所有构造函数都是private
,它实际上是最终的——任何重载只能通过在同一个源文件中写入 child/siblings 来发生,并且大概任何在那里写入的人都知道条件或至少负责遵守它们)。或者,您的方法将不依赖于它所具有的任何属性,或者,它所依赖的属性至少被记录在案,并且买者自负。
或者,让您的可重写方法成为单行代码,将工作外包给不可重写的方法(例如,私有方法 and/or 最后一个)。在您需要专门锁定到您的基本实现的属性的地方,调用帮助程序。当然,这本身就令人困惑:大概如果有人决定重写该方法,那么在某些情况下根本不会调用他们的重写是很奇怪的。
第三个(记录下来并祈祷)确实存在 - 例如,您可以自由地为某些 class 编写不一致的 equals/hashCode 算法,然后使用该 [=44] 的实例=] 作为 HashMap 中的键,但结果将是奇怪的,各种 Map 方法完全撒谎,并且在意想不到的时候出现奇怪的异常。这大概是决定不阅读 equals/hashCode.
合同要求的闪光灯如果必须的话,你也可以做同样的事情。