gpt4 book ai didi

kotlin - 如何在 super 接口(interface)上调用被覆盖的函数?

转载 作者:行者123 更新时间:2023-12-04 03:23:56 26 4
gpt4 key购买 nike

interface CrudRepo {
fun save()
fun saveAll()
}

interface CustomRepo : CrudRepo {
fun validate()
override fun save() {
validate()
saveAll() // can call saveAll, I need to call save on CrudRepo here
}
}
CrudRepo有一个函数 save 不做验证。我决定编写自己的接口(interface)来扩展 CrudRepo并覆盖保存方法。在我自己对 save 的定义中我想验证然后调用 save CrudRepo 上的方法.

我应该尝试什么?

最佳答案

如果您尝试使用 super ,您将收到一条错误消息,提示“无法直接访问抽象成员”。这适用于接口(interface)和类;你不能在 super 上调用无体抽象方法.这意味着这不会编译:

interface CrudRepo {
fun save()
fun saveAll()
}

interface CustomRepo : CrudRepo {
fun validate()
override fun save() {
validate()
super.saveAll()
}
}

但是将 CrudRepo 界面更改为:
interface CrudRepo {
fun save()
fun saveAll(){
}

}

它确实如此。

如果你想要一个抽象的例子,你去:
abstract class CrudRepo {
abstract fun save()
abstract fun saveAll()
}

class CustomRepo : CrudRepo() {
override fun saveAll() { }
override fun save() {
super.saveAll()
}
}

您将收到相同的错误消息。这是因为您不能调用方法的未实现版本。另外,让我们看看继承。
interface CustomRepo : CrudRepo
class MyClass : CustomRepo

表示 MyClass是 CrudRepo 和 CustomRepo 的 child 。两个 MyClass() as CustomRepoMyClass() as CrudRepo会编译。

现在,这对您的问题意味着什么?

没有 save CrudRepo 中的方法来自 CustomRepo的观点。它没有实现,因此你不能直接调用它。调用 super.saveAll()正如我在上面显示的那样意味着 call the saveAll method on my parent . super是一个非常严格的关键字。但是, saveAll()没有被覆盖。您可以调用 save ,但不能在超接口(interface)调用,因为超接口(interface)没有保存方法 有 body .这句话的最后三个词在这里非常重要;由于 CrudBody 接口(interface)中定义的方法没有主体,所以不能调用它。

此外,由于您已经覆盖了该方法,因此对它的任何调用都会导致递归。如果你这样做:
override fun save(){
save()
}

它会一遍又一遍地调用自己,直到崩溃。见 What is a StackOverflowError? .

现在,如果你有一个实际的类(class):
class CustomRepoImpl : CustomRepo{
override fun saveAll() {
}

override fun save() {
super.save()
}

override fun validate() {
}

}

注意它如何调用 super ;它现在将调用 CustomRepo 中的 super 方法.但是,这不是必需的。

当你覆盖 saveCustomRepo ,请记住一件事:您正在覆盖 CrudRepo 的方法。不再需要任何子类来覆盖它。我的示例实现将在没有它的情况下编译。原因 saveAll有效(没有 super 关键字)是因为它是抽象的,并且不引用调用它的方法。请参阅 StackOverflowError 链接。如果你调用一个被覆盖的方法,子类中的那个方法会被调用,除非该方法是在 super 上调用的。 .

而且你不能调用 super在父类(super class)或接口(interface)中的无体方法上,因为语言不知道你指向什么,因为那里什么都没有。

TL;DR: 您不能调用抽象/无主体方法的 super 方法。 saveAll指方法的第一个实现,如果在子类中定义,则指父类(super class)。调用 save将导致 StackOverflowError。

关于kotlin - 如何在 super 接口(interface)上调用被覆盖的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52517418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com