为什么使用Kotlin“by”通过匿名子类?

我目前正在观看来自Google I / O 2017的video ,并遇到了Kotlin by特性。

下面的例子是为了避免在实际上只关心其中一个接口的时候实现接口的每一种方法。

by实施(从video):

 class MyListener : TransitionListener by EmptyTransitionListener { override fun onTransitionStart(transition: Transition) { } } object EmptyTransitionListener : TransitionListener { override fun onTransitionEnd(transition: Transition) {} override fun onTransitionResume(transition: Transition) {} override fun onTransitionPause(transition: Transition) {} override fun onTransitionCancel(transition: Transition) {} override fun onTransitionStart(transition: Transition) {} } window.sharedElementEnterTransition.addListener(MyListener()) 

没有实施(就像我以前那样):

 open class EmptyTransitionListener : TransitionListener { override fun onTransitionEnd(transition: Transition) {} override fun onTransitionResume(transition: Transition) {} override fun onTransitionPause(transition: Transition) {} override fun onTransitionCancel(transition: Transition) {} override fun onTransitionStart(transition: Transition) {} } window.sharedElementEnterTransition.addListener(object: EmptyTransitionListener() { override fun onTransitionStart(transition: Transition) { } }) 

彼此有什么优势?

原则:构成>inheritance

它只是遵循“构成而不是inheritance”的原则。

面向对象编程(OOP)中inheritance(或复合重用原则)的组合是这样一个原则,即类应该通过其组合( 通过包含实现所需function的其他类的实例)实现多态行为和代码重用,而不是从基础或父类。 这是一个经常说的面向对象的原则

科特林代表团

这正是Kotlin关于申请class级授权的关键所在 。

委托模式已经被certificate是实现inheritance的一个很好的选择,而Kotlin在本地支持它需要零代码。

委托模式

另请参阅https://en.wikipedia.org/wiki/Delegation_pattern :

在软件工程中,委托模式是一种面向对象的设计模式,它允许对象组合实现与inheritance一样的代码重用。 […]

进一步阅读

按照这个stackoverflow讨论进一步的信息。

by ,您可以重复使用多个类的相同实现。

 class MyListener : TransitionListener by EmptyTransitionListener { override fun onTransitionStart(transition: Transition) { Log.d("MyListener", "Hi from MyListener!") } } class MySecondListener : TransitionListener by EmptyTransitionListener { override fun onTransitionStart(transition: Transition) { Log.d("MySecondListener ", "Hi from MySecondListener!") } } object EmptyTransitionListener : TransitionListener { override fun onTransitionEnd(transition: Transition) {} override fun onTransitionResume(transition: Transition) {} override fun onTransitionPause(transition: Transition) {} override fun onTransitionCancel(transition: Transition) {} override fun onTransitionStart(transition: Transition) {} } window.sharedElementEnterTransition.addListener(MyListener())