【问题标题】:Kotlin data class inheritanceKotlin 数据类继承
【发布时间】:2020-10-08 13:20:34
【问题描述】:

我有 2 个 Mongo 集合对应于以下数据类:ArcadeSessions、ArcadeMarioSessions

data class PlayingSession(
    val sessionId: Int
    val sessionDescription: String
    val game: Game // Mario, GTA, ...
)

data class MarioPlayingSession(
    val numberOfJumps : Int
    val totalMarioScore: Int
    val level: MarioLevel
) : PlayingSession(...)


data class ArcadeSessions(
    val id: Int, // player ID
    val sessionHistory: List<PlayingSession>?
)

data class ArcadeMarioSessions(
    val id: Int, // player ID
    val sessionHistory: List<MarioPlayingSession>?
)

如您所见,ArcadeMarioSessions 基本上包含每个玩家的 ArcadeSessions 子集(我们先不谈“为什么”)。

这样写感觉像是反人类罪(就像完全不同的课程) 但由于某种原因,我无法让数据类与继承很好地发挥作用。

这样写的正确方法是什么?

【问题讨论】:

  • @deHaar 看到这篇文章,我看到的只是数据类和继承不能很好地结合在一起,问题是什么,比如这里的正确解决方案是什么?
  • 该问题包含几个可以作为替代的答案,例如abstract classes。我知道这在某种程度上违反了data classes 的便利性。也许你可以使用它...

标签: mongodb kotlin data-class


【解决方案1】:

如果不能使用继承,请使用组合:

data class MarioPlayingSession (
    val numberOfJumps: Int,
    val totalMarioScore: Int,
    val level: MarioLevel,
    val playingSession: PlayingSession
)

但是checkingMarioPlayingSession的实例是否符合PlayingSession会返回false。 一个有点麻烦的解决方法是:

  1. 定义接口
interface PlayingSession {
    val sessionId: Int
    val sessionDescription: String
    val game: Game // Mario, GTA, ...
}

interface MarioPlayingSession {
    val numberOfJumps : Int
    val totalMarioScore: Int
    val level: MarioLevel
}
  1. 实现它们(使用Implementation by Delegation 功能)
data class PlayingSessionImpl(
    override val sessionId: Int,
    override val sessionDescription: String,
    override val game: Game // Mario, GTA, ...
) : PlayingSession

data class MarioPlayingSessionImpl (
    override val numberOfJumps: Int,
    override val totalMarioScore: Int,
    override val level: MarioLevel,
    val playingSession: PlayingSession
) : MarioPlayingSession, PlayingSession by playingSession

现在MarioPlayingSessionImplPlayingSessionImpl 都可以放入List&lt;PlayingSession&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多