Kotlin数据类继承

问题描述

我有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子集(让我们不要“为什么”)。

像这样写(就像完全不同的阶级)感觉像是危害人类罪。 但是由于某种原因,我无法使数据类在继承中发挥良好的作用。

写这种东西的正确方法是什么?

解决方法

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

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,...
) : 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<PlayingSession>