简单列子
interface Listener {//1
fun onSuccess()
fun onFailed()
}
class A() : Listener{//2
override fun onSuccess() {
}
override fun onFailed() {
}
}
class B() : Listener{//3
override fun onSuccess() {
}
override fun onFailed() {
}
}
- 定义Listener接口,A、B都实现Listener接口。如果A、B onSuccess\onFailed处理是一致的,那么代码是否就冗余了?这时候就可以用到委托了。
class ListenerImpl : Listener {//1
override fun onFailed() {
//do something
}
override fun onSuccess() {
//do something
}
}
//定义
class A(listener: Listener) : Listener by listener//2
class B(listener: Listener) : Listener by listener//3
//调用
A(ListenerImpl())
B(ListenerImpl())
- 注释1:定义公共的实现;
- 注释2、3:类A的Listener接口委托传入的listener对象处理,类B也是;
反编译看看原理
public final class A implements Listener {
// $FF: synthetic field
private final Listener $$delegate_0;
public A(@NotNull Listener listener) {
Intrinsics.checkNotNullParameter(listener, "listener");
super();
this.$$delegate_0 = listener;
}
public void onFailed() {
this.$$delegate_0.onFailed();//1
}
public void onSuccess() {
this.$$delegate_0.onSuccess();//2
}
}
- 好像也没什么值得分析的,哈哈哈。调用的都是委托对象的接口。
总结
接口委托,将接口的逻辑交给委托来处理,很适合运用在接口实现一致的,或者用组合的方式来构建能力的场景。
以上分析有不对的地方,请指出,互相学习,谢谢哦!