【问题标题】:How to keep Kotlin property syntax when defining an Interface?定义接口时如何保持 Kotlin 属性语法?
【发布时间】:2020-04-08 13:25:33
【问题描述】:

澄清:属性语法 == val s = supportFragmentManager 而不是 val s = getSupportFragmentManager()

如果我正在为 Activity 类编写接口,并且想在保留属性语法的同时公开属性,我该怎么做?

创建一个继承AppCompatActivity的类,实现如下接口。

interface MyInterface {
   fun getSupportFragmentManager: FragmentManager // Option 1 Boo!
   val supportFragmentManager: FragmentManager    // Option 2 Yey!
}

选项 1 可以正常工作。 MyActivity 已经包含一个名为 getSupportFragmentManager() 的函数,因此我不必实现它。

选项 2 将提示我实现缺少的属性,这样做会导致以下结果

class MyActivity: AppCompatActivity(), MyInterface {
    override val supportFragmentManager: FragmentManager
        get() = TODO("Not yet implemented")
}

这会给我一个错误,因为类中已经有一个具有相同签名的函数。

Accidental override: The following declarations have the same JVM signature (getSupportFragmentManager()Landroidx/fragment/app/FragmentManager;):
    fun <get-supportFragmentManager>(): FragmentManager defined in com.my.project.MyActivity
    fun getSupportFragmentManager(): FragmentManager defined in com.my.project.MyActivity

关于如何在整个接口中保持 Kotlins 属性语法的任何想法?

【问题讨论】:

  • 为什么不同时使用 get 和 set 并从界面中删除乐趣? override val supportFragmentManager: FragmentManager get() = TODO("尚未实现") set() = //你的代码?
  • 我不明白你的意思。我仍然遇到同样的冲突。如果我添加一个 getter 并且我想返回具有相同名称的属性,supportFragmentManager,它将尝试在循环中返回自身。但更重要的是,我需要它来实现该属性已经实现并使用该实现。

标签: android kotlin syntax interface overriding


【解决方案1】:

我刚刚检查了编译器警告,您得到的意外覆盖异常是因为定义了 get 函数和原始变量本身。

你可以这样做:

interface MyInterface {
   val supportFragmentManager: FragmentManager
}

class MyActivity: AppCompatActivity(), MyInterface {
    override val supportFragmentManager: FragmentManager = FragmentManager(...)
        get() = ... //logic (getter is optional, by default kotlin generates getter itself)
}

PS:在 getter 中,您可以使用 field 访问变量,也就是 supportFragmentManager,例如

get() = field.apply { updateSomthing() }

这会调用 MyActivity.updateSomthing() 并返回字段本身。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多