首页 > 解决方案 > 未实现的抽象乐趣调用()

问题描述

我创建了一个视图,但我的 Buttons ClickListener 界面遇到了问题。界面看起来像这样

interface CustomButtonsClickListener : () -> Unit {
        fun onPlusClick(view: View, button: ImageButton)
        fun onMinusClick(view: View, button: ImageButton)
    }

它通过以下方法实现:

fun setCustomButtonsClickListeners(clickListener: CustomButtonsClickListener) {
        binding.addButton.setOnClickListener {
            clickListener.onPlusClick(this, binding.addButton)
        }
        binding.minusButton.setOnClickListener {
            clickListener.onMinusClick(this, binding.minusButton)
        }
    }

这就是它看起来像“外面”的样子

view.setCustomButtonsClickListeners(object : CustomButtonsClickListener {
                    override fun onPlusClick(view: View, button: ImageButton) {

                    }

                    override fun onMinusClick(view: View, button: ImageButton) {

                    }

                })

问题: 我说错了object
Object is not abstract and does not implement abstract member public abstract fun invoke()...

方法是什么invoke(),我应该如何实现它?我宁愿在 View 类中这样做,这样我就不必在应用程序中的某个地方使用 View 时这样做。

标签: kotlininterfaceinterface-implementationclicklistener

解决方案


这看起来像是对语法的混淆。该行:

interface CustomButtonsClickListener : () -> Unit {

创建一个扩展接口() -> Unit(并继续向其添加两个方法)。

() -> Unit是不带参数且不返回任何有用的函数的类型。您通常不需要知道该函数的名称(因为 lambda 语法隐藏了它),但这是您发现它被调用的那些极端情况之一…… invoke()

(它在文档中有所描述。)

因此,您正在定义一个具有三种方法的接口:一种从父接口继承,另两种在此处声明。

因此,当然,当您尝试实现接口但只实现这三个方法中的两个时,编译器会抱怨您忘记了第三个。

我猜你只想要一个只有两个新方法的接口,所以你可以简单地声明它:

interface CustomButtonsClickListener {

推荐阅读