让我们说听众有一个很大的界面:
interface Listener {
fun onEvent1();
fun onEvent2();
....
}
当我们要传递此侦听器的实例时,我们会写:
addListener(object: Listener {
override fun onEvent1() { }
override fun onEvent2() { }
etc...
})
但是,如果我只想订阅1个特定事件,让我们说onEvent12()
,我仍然必须覆盖接口中所有其余声明的函数,这些函数用空函数填充代码身体。是否有一种Kotlin惯用的方式来声明其余的只能是空函数(无操作),而我只想覆盖特定的函数?
答案 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;
});
这不是您通常应该做的事情,您应该期望显着的性能开销!但如果您没有其他选择,例如它仍然有用,例如如果监听器接口本身是动态确定的。