限制 Kotlin 中的类层次结构
Kotlin 是 JetBrains 开发的一种静态类型的通用编程语言,构建了 IntelliJ IDEA、PhpStorm、Appcode 等世界一流的 IDE。它由 JetBrains 于 2011 年首次推出,是一种新的 JVM 语言。 Kotlin 是一种面向对象的语言,是一种比Java“更好的语言”,但仍可与Java代码完全互操作。在本文中,我们将学习如何限制 Kotlin 中的类层次结构。在我们继续之前,您应该了解 OOP 的一些基本概念,并熟悉类和类的属性,如继承。
所以,当我们确定一个值或一个类只能有一组有限的类型或子类数量时,那就是我们试图限制类层次结构的时候。是的,这听起来像是一个枚举类,但实际上,它远不止于此。枚举常量仅作为单个实例存在,而密封类的子类可以有多个可以包含状态的实例。让我们看一下上述步骤中的一个示例。
分步实施
第 1 步。我们将创建一个名为ToastOperation的密封类。在同一个源文件下,我们将定义一个ShowMessageToast子类:
class ShowMessageToast(val message:String):ToastOperation()
第 2 步。此外,我们将定义一个ShowErrorToast对象:
object ShowErrorToast:ToastOperation()
步骤 3 。您可能已经注意到,我们定义了一个对象而不是完整的类声明,因为howErrorToast对象没有任何状态。此外,通过这样做,我们已将其删除 从 when 块开始,因为只有一个实例。现在,我们可以在 when 语句中使用它,如下所示:
Kotlin
fun doToastOperation (toastOperation: ToastOperation) {
when (toastOperation) {
is ShowMessageToast
->Toast.makeText(this, toastOperation.message, Toast.LENGTH_LONG).show()
ShowErrorToast->Toast . makeText (this, "Error...Grr!",Toast.LENGTH_LONG).show()
}
}
第 4 步。主要好处是我们不需要实现 else 块,当其他语句不符合要求时,它充当默认块。根据文档,密封类可以有子类,但所有子类都必须在与密封类本身相同的文件中声明。但是,子类的子类不需要在同一个文件中定义。它本身是抽象的,您不能从中实例化对象。这是我们密封类的结构:
sealed class ToastOperation {
}
object ShowErrorToast:ToastOperation()
class ShowMessageToast (val message:String):ToastOperation()
如您所见,我们将所有子类保存在我们定义密封类的同一源文件下。在前面的示例中,我们确信只能有两种类型的 toast:错误 toast 和带有自定义消息的 toast。所以我们创建了一个密封类ToastOperation并创建了ToastOperation的两个子类。请注意,如果我们不确定子类的类型,我们将不会使用密封类,在这种情况下,枚举类可能更适合。
如果您使用的是 1.1 之前的 Kotlin 版本,则需要在密封类中实现子类,就像这样:
sealed class ToastOperation {
object ShowErrorToast:ToastOperation()
class ShowMessageToast(val message:String):ToastOperation()
}
Note: You can use the preceding way in the new version of Kotlin as well.