2

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()   
}

我正在努力理解结果(整体)对象实际上是什么。结果对象实际上占用了七个 SideEffect 类的空间,还是一个?(或者,如果除了名称之外所有类都相同,这是一个棘手的问题)?

4

2 回答 2

2

不,它只有一种可能。

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

在这种情况下,aside 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下我们会需要这个,但是因为这是一个代数数据类型并且类型是已知的,我们不需要指定它。

于 2020-08-26T15:19:47.623 回答
1

考虑它的一种方法是好像您根本不使用它sealed。您将拥有一个abstract class SideEffect、一个类Hit、一个类TerroristShot等(因为sealed暗示abstract)。

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

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

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

于 2020-08-26T17:37:41.713 回答