【问题标题】:Abstract fun invoke() not implemented抽象有趣的调用()未实现
【发布时间】:2021-03-13 16:41:49
【问题描述】:

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

【问题讨论】:

    标签: kotlin interface interface-implementation clicklistener


    【解决方案1】:

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

    interface CustomButtonsClickListener : () -> Unit {
    

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

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

    (在the documentation中有描述。)

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

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

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

    interface CustomButtonsClickListener {
    

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多