大型接口的对象实例中的故意无操作

时间:2018-02-16 22:58:06

标签: android kotlin

让我们说听众有一个很大的界面:

interface Listener {
   fun onEvent1();
   fun onEvent2();
   ....
}

当我们要传递此侦听器的实例时,我们会写:

addListener(object: Listener { 
    override fun onEvent1() { }
    override fun onEvent2() { }
    etc...
})

但是,如果我只想订阅1个特定事件,让我们说onEvent12(),我仍然必须覆盖接口中所有其余声明的函数,这些函数用空函数填充代码身体。是否有一种Kotlin惯用的方式来声明其余的只能是空函数(无操作),而我只想覆盖特定的函数?

3 个答案:

答案 0 :(得分:2)

这没有多大意义。实现接口时,必须坚持完整合同,因为客户端很可能会在不知道具体实现的情况下使用此接口的引用。你的方法会破坏接口的目的,你不同意吗?

正如您所说的那样,将界面分成多个界面是有意义的,例如:每个事件。然后,具体类可以实现这些侦听器接口中的0..n。

答案 1 :(得分:1)

在Kotlin中,interfaces可以有默认方法实现,所以只需将它们定义为no-ops:

interface Listener {
  fun onEvent1() { }
  fun onEvent2() { }
  ....
}

然后只覆盖你关心的那个:

addListener(object: Listener { 
  override fun onEvent1() { /* this is the one I care aboue */ }
})

希望有所帮助!

答案 2 :(得分:0)

虽然有充分的理由不提供该语言,正如@ s1m0nw1所说,实际上可以使用Java reflection完成:

this.list = _.map(this.list).map(function (x) {
let armor: Armor = Object.assign(new Armor, x);
return armor;
});

这不是您通常应该做的事情,您应该期望显着的性能开销!但如果您没有其他选择,例如它仍然有用,例如如果监听器接口本身是动态确定的。