首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一类的Kotlin密封类

同一类的Kotlin密封类
EN

Stack Overflow用户
提问于 2020-08-26 22:47:05
回答 2查看 190关注 0票数 2

KorGE游戏库示例游戏(CounterStrike)具有以下结构:

代码语言:javascript
复制
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类的空间,还是一个呢?(或者,如果除了名称之外,所有类都是相同的,那么这是刁钻的问题吗)?

EN

回答 2

Stack Overflow用户

发布于 2020-08-26 23:19:48

不,它只有一种可能性。

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

因此,在这种情况下,side effect可以将其中一个类嵌入到密封类中。

这样做的主要优点是我们可以这样做:

代码语言:javascript
复制
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条件下,我们需要它,但是因为这是一个代数数据类型,并且类型是已知的,所以我们不需要指定它。

票数 2
EN

Stack Overflow用户

发布于 2020-08-27 01:37:42

考虑这个问题的一种方法是,如果您根本不使用sealed。您将拥有一个abstract class SideEffect、一个类Hit、一个类TerroristShot等(因为sealed暗示abstract)。

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

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

就to存储而言,sealed classabstract class没有什么不同,它的子类也与常规类没有什么不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63600188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档