kotlin 默认值
介绍
继续本周的Kotlin月 ,我将在Kotlin中讨论与继承和默认值有关的主题。
继承而不是继承
Kotlin引入了一项功能和一些默认设置,以帮助开发人员将“组合优先于继承”的原则摆在他们的脑海中。 第一个功能是在定义包装器类时,使您几乎可以像继承一样轻松地进行编写。
一流的代表团
Kotlin在您(开发人员)的帮助下,几乎可以提供一流的委派权限。 所有需要做的是:
- 新类从接口继承
- 新类提供了一个主要的构造函数,该构造函数定义了从同一接口继承的属性
- 声明接口的继承后,包括“ by <属性名称>”
例如:
interface A {
fun doSomething(): Unit
}
class B (val a: A) : A by a
在此示例中,我们有接口A
,该接口具有要实现的doSomething()
方法。 B
类是我们的代理人类。 它从继承A
,包括具有的性质的主构造称为a
从继承A
( (val a: A)
并表示委托给a
与A by a
。
现在, B
不需要显式实现A
任何方法,因为它们是通过委托隐式提供的,就像B
继承自完全实现的类时,它具有常规继承一样。 在这种情况下,它不仅指向其父类实现,而且还获得默认实现,就好像B
是这样定义的:
class B (val a: A) A {
override fun doSomething() {
a.doSomething()
}
}
一次也可以为多个接口完成委派。
我用Python创建了一个类装饰器 ,前一段时间我做了类似的事情,因为我非常喜欢这个主意。
Kotlin实际上需要这种语言中的类似内容以及一组特定的默认值。
最终默认
在Kotlin中,类和公共方法默认为final
,这意味着它们不能分别继承或覆盖。 为了使这些选项可用,类和方法必须标记为open
。
这与Effective Java中的第17项(即“为继承进行设计和文档设计或禁止继承”)相呼应,就像整个项目与Effective Java中的第16项(“继承中的重要组成”)对齐一样。
这两部分可以很好地协同工作,并希望这意味着用Kotlin编写的代码质量更高。
许多人反对最终通过默认的决定,但他们在很大程度上似乎没有意识到,C#有过同样的事情,一直以来( 不包括一流的代表团,我可以补充),我没有听说从他们身边任何投诉。 我敢冒险猜测,大多数争论这一点的人也没有偏爱构图的心态。 显然,在某些情况下这可能适得其反(特别是如果库没有为您要扩展的特定类提供接口),但这有望避免出现更多的问题。
可见性修改器默认值
在整个Java中,最常键入的单词是什么? 我敢冒险猜测它是public
, return
和import
紧随其后。 在大多数情况下,该public
关键字比较混乱。 大多数事情都是公开的,可能应该是默认设置。 Kotlin决定这样做,以使代码更整洁。
现在,这确实违反了封装的一般建议,以使类的成员尽可能地私有,但是即使很好地遵循了该建议, public
仍然是最常见的可见性修饰符。 因此,幸运的是, public
是Kotlin的默认设置。
密封类
我认为,密封类比有用的功能更有趣。 它们提供了一种锁定层次结构的方法,以便密封类的唯一子类是在其边界内定义的子类。 对于拆分型monad(例如Either和Maybe / Optional),以及根据文档中使用的示例判断,表达式树确实非常方便。
同样,Kotlin还有一个附加功能,可以很好地与该功能配合使用,这就是when
表达式,它是重新构想的switch
。 编译器使when
表达式知道是否提供了所有子类,从而不会强迫您不必要地提供默认的else
子句。
再次,我发现此功能有趣而不是有用,特别是因为我制定了一种(稍微更痛苦的)方式来在Java中很大程度上重新创建相同的东西(一个或两个额外的想法贯穿于我的脑海)。 如果您对我的做法感到好奇,请留下评论让我知道,我将对此发表一篇文章。
扩展方法
扩展方法是事实之后可以“添加到类”的方法。 我使用引号是因为引号实际上并没有添加到类中(至少在Kotlin中没有)。 相反,它们是一种静态方法,可以像在实例上使用它们一样使用,从而允许您导入仅在某些实例中使用的方法,并通过自动补全发现它们。 但是大多数情况下,它是使静态方法看起来不那么愚蠢的语法。
为什么这些在编程世界中不再是一件大事? 如果将所有String
和Date
实用程序类用作实际类的扩展,它们将非常容易使用。 除了C#之外,我不知道有其他语言可以执行此操作(可以理解,动态语言实际上不需要此功能的任何特殊功能,因为您可以随时在类中添加任何方法)。 如果您知道任何信息,如果您在评论中列出它们,将不胜感激。
有关扩展方法的另一个真棒的事情是如何Kotlin结合他们lambda表达式进行扩展lambda表达式,这使得某些事情像他们的 类型安全的 建设者清爽多了。
奥托罗
这就是本文的结尾。 下周收看Kotlin月的第三篇文章! 那将超越Kotlin具有的安全功能,例如无效安全性和改进的仿制药。
翻译自: https://www.javacodegeeks.com/2016/03/kotlin-month-post-2-inheritance-defaults.html
kotlin 默认值