Kotlin月发布2:继承与默认值

介绍

继续本周的Kotlin月 ,我将在Kotlin中讨论与继承和默认值有关的主题。

继承而不是继承

Kotlin引入了一项功能和一些默认设置,以帮助开发人员将“组合优先于继承”的原则摆在他们的脑海中。 第一个功能是在定义包装器类时使您几乎可以像继承一样轻松地进行编写。

一流的代表团

Kotlin在您(开发人员)的帮助下,提供了一流的代理访问权限。 所有需要做的是:

  1. 新类从接口继承
  2. 新类提供了一个主要的构造函数,该构造函数定义了从同一接口继承的属性
  3. 声明接口的继承后,包括“ by <属性名称>”

例如:

interface A {
   fun doSomething(): Unit
} 

class B (val a: A) : A by a

在此示例中,我们具有接口A ,该接口具有要实现的doSomething()方法。 B类是我们的代理人类。 它从继承A ,包括具有的性质的主构造称为a从继承A(val a: A)并表示委托给aA 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中,最常键入的单词是什么? 我敢冒险猜测它是publicreturnimport紧随其后。 在大多数情况下,该public关键字比较混乱; 大多数事情都是公开的,可能应该是默认设置。 Kotlin决定这样做,以使代码更整洁。

现在,这确实与封装的一般建议背道而驰,该建议使类的成员尽可能地私有,但是即使很好地遵循了此建议, public仍然是最常见的可见性修饰符。 因此,幸运的是, public是Kotlin的默认设置。

密封类

我认为,密封类比有用的功能更有趣。 它们提供了一种锁定层次结构的方法,以便密封类的唯一子类是在其边界内定义的子类。 对于拆分型monad(例如Either和Maybe / Optional),以及根据文档中使用的示例判断,表达式树确实非常方便。

同样,Kotlin还有一个附加功能,可以很好地与该功能配合使用,这就是when表达式,它是重新构想的switch 。 编译器使when表达式知道是否提供了所有子类,从而不会强迫您不必要地提供默认的else子句。

再说一次,我发现此功能有趣而不是有用,特别是因为我想出了一种(稍微更痛苦的)方法来在Java中很大程度上重新创建相同的东西(一个或两个额外的想法贯穿于我的脑海)。 如果您想知道我的操作方式,请发表评论让我知道,我将对此发表一篇文章。

扩展方法

扩展方法是事实之后可以“添加到类”的方法。 我使用引号是因为引号实际上并没有添加到类中(至少在Kotlin中没有)。 相反,它们是一个静态方法,可以像在实例上使用方法一样使用,允许您导入仅在某些实例中使用的方法,并通过自动补全发现它们。 但是大多数情况下,它是使静态方法看起来不那么愚蠢的语法。

为什么这些在编程世界中不再是一件大事? 如果将所有StringDate实用程序类用作实际类的扩展,则它们将更易于使用。 除了C#之外,我不知道有其他语言可以执行此操作(可以理解,动态语言实际上不需要此功能的任何特殊功能,因为您可以随时在字面上添加任何方法到类中)。 如果您知道任何信息,如果您在评论中列出它们,将不胜感激。

有关扩展方法的另一个真棒的事情是如何Kotlin结合他们lambda表达式进行扩展lambda表达式,这使得某些事情像他们的 类型安全的 建设者清爽多了。

奥托罗

这就是本文的结尾。 下周收看Kotlin月的第三篇文章 那将超越Kotlin具有的安全功能,例如无效安全性和改进的仿制药。

翻译自: https://www.javacodegeeks.com/2016/03/kotlin-month-post-2-inheritance-defaults.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值