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类的空间,还是一个呢?(或者,如果除了名称之外,所有类都是相同的,那么这是刁钻的问题吗)?
发布于 2020-08-26 23:19:48
不,它只有一种可能性。
这个概念通常被称为代数数据类型,用于定义类可以具有的有限可能性集。
因此,在这种情况下,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条件下,我们需要它,但是因为这是一个代数数据类型,并且类型是已知的,所以我们不需要指定它。
发布于 2020-08-27 01:37:42
考虑这个问题的一种方法是,如果您根本不使用sealed。您将拥有一个abstract class SideEffect、一个类Hit、一个类TerroristShot等(因为sealed暗示abstract)。
sealed的唯一不同之处在于您列出的直接子类(Hit等)是SideEffect唯一可以拥有的直接子类。您不能在代码中的任何其他地方添加更多直接子类。
因此,您知道任何SideEffect类型的值都必须是这7个子类之一的实例。SideEffect类本身就是abstract,所以永远不能直接实例化它。
就to存储而言,sealed class与abstract class没有什么不同,它的子类也与常规类没有什么不同。
https://stackoverflow.com/questions/63600188
复制相似问题