问题描述
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 class
与abstract class
没什么不同,它的子类与常规类没有什么不同。