[英]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 class
与abstract class
没有区别,其子abstract class
与常规类没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.