抽象的乐趣 invoke() 未实现

问题描述

我创建了一个视图,但我的按钮 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 时执行此操作。

解决方法

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

interface CustomButtonsClickListener : () -> Unit {

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

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

(在 the documentation 中有描述。)

所以你定义了一个带有三个方法的接口:一个从父接口继承,另外两个在这里声明。

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

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

interface CustomButtonsClickListener {