为什么使用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())
- 我如何使用视图模型,用sqlite和广播接收器来更新UI?
- JVM和JavaScript的无头单源库
- Kotlin为assertThat(foo,instanceOf(Bar.class))
- 使用@Cacheable时,Spring Boot不会自动启动记录器
- Jacoc Jenkins插件与Kotlin
- 我现在正在用Kotlin开发一个Android应用程序,但是发生了一个错误:CompilationException:无法将方法调用“readText”内联到
- 从Android Studio中的播放图标开始检测测试,将它们作为JVM上的JUnit运行
- 静态数据在Kotlin
- Kotlin胶囊Gradle错误