为什么在匿名子类上使用 Kotlin "by"?
Why using Kotlin "by" over anonymous subclass?
我目前正在观看来自 Google I/O 2017 年的这个 video 并且遇到了 Kotlin 的 by
功能。
下面的示例可以避免在您实际只关心其中一个方法时实现接口的每个方法。
使用 by
实现(来自视频):
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())
没有 by
实施(正如我过去所做的那样):
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) {
}
})
一个比另一个有什么优势?
使用 by
,您可以 为多个 class 重复使用 相同的实现。
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())
原则:组合 > 继承
只是遵循了"Composition over inheritance"的原则。
Composition over inheritance (or composite reuse principle) in object-oriented programming (OOP) is the principle that classes should achieve polymorphic behavior and code reuse by their composition (by containing instances of other classes that implement the desired functionality) rather than inheritance from a base or parent class. This is an often-stated principle of OOP [...].
Kotlin 委托 by
这正是 by
的意思,Kotlin 用于应用 class delegation 的关键字。
The Delegation pattern has proven to be a good alternative to implementation inheritance, and Kotlin supports it natively requiring zero boilerplate code.
委派模式
另请参阅 https://en.wikipedia.org/wiki/Delegation_pattern:
In software engineering, the delegation pattern is an object-oriented design pattern that allows object composition to achieve the same code reuse as inheritance. [...]
进一步阅读
关注此 Whosebug discussion 了解更多信息。
我目前正在观看来自 Google I/O 2017 年的这个 video 并且遇到了 Kotlin 的 by
功能。
下面的示例可以避免在您实际只关心其中一个方法时实现接口的每个方法。
使用 by
实现(来自视频):
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())
没有 by
实施(正如我过去所做的那样):
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) {
}
})
一个比另一个有什么优势?
使用 by
,您可以 为多个 class 重复使用 相同的实现。
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())
原则:组合 > 继承
只是遵循了"Composition over inheritance"的原则。
Composition over inheritance (or composite reuse principle) in object-oriented programming (OOP) is the principle that classes should achieve polymorphic behavior and code reuse by their composition (by containing instances of other classes that implement the desired functionality) rather than inheritance from a base or parent class. This is an often-stated principle of OOP [...].
Kotlin 委托 by
这正是 by
的意思,Kotlin 用于应用 class delegation 的关键字。
The Delegation pattern has proven to be a good alternative to implementation inheritance, and Kotlin supports it natively requiring zero boilerplate code.
委派模式
另请参阅 https://en.wikipedia.org/wiki/Delegation_pattern:
In software engineering, the delegation pattern is an object-oriented design pattern that allows object composition to achieve the same code reuse as inheritance. [...]
进一步阅读
关注此 Whosebug discussion 了解更多信息。