Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以省略Kotlin中不使用的接口方法吗?_Kotlin - Fatal编程技术网

我可以省略Kotlin中不使用的接口方法吗?

我可以省略Kotlin中不使用的接口方法吗?,kotlin,Kotlin,如果我只对参见的感兴趣,而不关心其他活动,该怎么办?我至少可以省略没有返回值的方法吗 interface EventHandler { fun onSee() fun onHear() fun onSmell() fun onTouch() fun onAwake() fun onSleep() } fun addEventHandler(handler:EventHandler) { } fun Main() { addEventH

如果我只对参见的
感兴趣,而不关心其他活动,该怎么办?我至少可以省略没有返回值的方法吗

interface EventHandler
{
    fun onSee()
    fun onHear()
    fun onSmell()
    fun onTouch()
    fun onAwake()
    fun onSleep()
}

fun addEventHandler(handler:EventHandler)
{

}

fun Main()
{
    addEventHandler(object:EventHandler
    {
        override fun onSee()
        {
            print("I see.")
        }
    })
}

当然,您只能实现一个接口方法,您所要做的就是在接口声明中为其他方法提供默认实现

interface EventHandler {
    fun onSee()
    fun onHear() { /* default implementation */ }
    fun onSmell(){ /* default implementation */ }
    fun onTouch(){ /* default implementation */ }
    fun onAwake(){ /* default implementation */ }
    fun onSleep(){ /* default implementation */ }
}
现在,当您创建此接口的实例时,只需要为
onSee()
方法提供一个强制实现,rest是可选的

如果您不是原始界面的作者 您可以扩展原始接口,并为所需的方法提供默认实现

interface OnSeeEventHandler: EventHandler {
    override fun onHear() { /* default implementation */ }
    override fun onSmell(){ /* default implementation */ }
    override fun onTouch(){ /* default implementation */ }
    override fun onAwake(){ /* default implementation */ }
    override fun onSleep(){ /* default implementation */ }
}

并使用
OnSeeEventHandler
只提供
onSee
方法imeplementation

我提出了以下有点p̶e̶r̶e̶r̶s̶e̶有趣的方法

下面的函数使用a来“具体化”接口,并仅使用所需的方法对其进行修补。未修补的方法将仅返回
null
Unit
,具体取决于返回类型

import java.lang.reflect.Proxy.newProxyInstance

inline fun <reified T> Any.materialize(): T = materialize(T::class.java, this)

fun <T> materialize(i: Class<T>, x: Any = object {}): T {
    @Suppress("UNCHECKED_CAST")
    return newProxyInstance(i.classLoader, arrayOf(i)) { _, m, args ->
        x.javaClass.methods
                .asSequence()
                .filter {
                    it.name == m.name
                            && it.parameterTypes!!.contentEquals(m.parameterTypes)
                }
                .map {
                    it.invoke(x, *args.orEmpty())
                }.firstOrNull()
    } as T
}
免责声明

  • 使用此选项,您将丢失所有编译时检查,因为所有问题都在运行时得到解决
  • 此实现未涵盖某些内容(例如,接口默认方法)
  • 根本不考虑性能
  • 需要
    kotlin reflect
    依赖项
  • 今天是我学习Kotlin的第二天,所以可能会有很多未解决的边缘案例和bug

我不会在大多数情况下使用这个 案例,并将继续支持支持部分 接口实现(如TypeScript的
部分

我只是提供 这是因为它可能对某些用例感兴趣,而我 对不起,如果这让你的眼睛流血


非常感谢。我不知道这件事。如果我是界面的作者,这将非常有用。但是当使用现有的Android/Java SDK时,它不能被使用,是吗?@DamnVegetables在这种情况下,编写一个默认实现
类DefaultEventHandler:EventHandler{…}
并通过DefaultEventHandler()将
对象:EventHandler委托给它
@DamnVegetables我已经编辑了我的答案来满足你的担忧。相关:“我在大多数情况下不会自己使用这个”这是答案中一个令人振奋的声明。)@Farid一切都是以科学的名义!问题是“能做到吗?”,而不是“应该做到吗?”:)
interface Foo {
    fun bar()
    fun baz(): String
    fun qux(s: String): String
}

fun main(vararg args: String) {
    val foo = object {
        fun qux(s: String): String {
            return "Returned from qux: $s"
        }
    }.materialize<Foo>()

    println(foo.bar()) // void no-op, prints "kotlin.Unit"
    println(foo.baz()) // no-op with return value, prints "null"
    println(foo.qux("Hello")) // prints "Returned from qux: Hello"

}