[在定义接口时如何保持Kotlin属性语法?

问题描述 投票:0回答:1

澄清:属性语法== 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属性语法的任何想法?

android kotlin syntax interface overriding
1个回答
0
投票
我刚刚检查了编译器警告,而您遇到的意外覆盖异常是因为同时定义了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()并返回字段本身。
© www.soinside.com 2019 - 2024. All rights reserved.