繁体   English   中英

Kotlin Sealed Class 相同类

[英]Kotlin Sealed Class of same Classes

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 类的空间,还是一个? (或者,如果除名称外所有类都相同,这是否是一个棘手的问题)?

不,它只有一种可能性。

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

在这种情况下, 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类型的任何值SideEffect必须是这 7 个子类之一的实例。 SideEffect类本身是abstract ,因此永远不能直接实例化它。

在存储方面, sealed classabstract class没有区别,其子abstract class与常规类没有区别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM