Kotlin密封的同类课程

问题描述

KorGE游戏库示例游戏(CounterStrike)具有以下构造:

sealed class SideEffect{
    class Hit() : SideEffect()
    class TerroristShot(val terrorist: Terrorist) : SideEffect()
    class KillTerrorist(val terrorist: Terrorist) : SideEffect()
    class ShowTerrorist(val terrorist: Terrorist) : SideEffect()
    class HideTerrorist(val terrorist: Terrorist) : SideEffect()
    class CounterTerroristWin : SideEffect()
    class TerroristsWin : SideEffect()   
}

,我正在努力了解最终的(总体)对象实际上是什么。生成的Object是否实际占用了七个SideEffect类或一个的空间? (或者这是一个技巧性的问题,如果除了名称之外,所有类都一样)?

解决方法

不,它只有一种可能性。

这个概念通常被称为代数数据类型,用于定义类可以具有的有限可能性。

在这种情况下,side effect可以具有嵌入在密封类中的类之一。

此方法的主要优点是我们可以执行以下操作:

fun determineSideEffect(effect: SideEffect) = when(effect){
    is Hit -> do something when hit
    is TerroristShot -> do something when terrorist is shot
    is KillTerrorist -> do something when terrorist is killed
    is ShowTerrorist -> do something when terrorist is shown
    is HideTerrorist -> do something when terrorist is hidden
    is CounterTerroristWin -> do something when counter terrorist wins
    is TerroristsWin ->  do something when a terrorist wins
}

请注意,我们没有else子句。通常在when条件下,我们将需要此条件,但是由于这是代数数据类型,并且已知这些类型,因此我们无需指定它。

,

一种思考方式是好像根本不使用sealed。您将拥有一个abstract class SideEffect,一个类Hit,一个类TerroristShot等(因为sealed意味着abstract)。

sealed的唯一区别在于,您列出的直接子类(Hit等)是SideEffect唯一的直接子类。您不能在代码中的其他任何地方添加更多直接子类。

因此,您知道类型SideEffect的任何值都必须是这7个子类之一的实例。 SideEffect类本身是abstract,所以永远不能直接实例化它。

在存储方面,sealed classabstract class没什么不同,它的子类与常规类没有什么不同。