澄清:属性语法== 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属性语法的任何想法?
您可以这样做:
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()并返回字段本身。