问题描述
我有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
)
但是checking的MarioPlayingSession
实例是否符合PlayingSession
将返回false。
这样做的麻烦的解决方法是:
- 定义接口
interface PlayingSession {
val sessionId: Int
val sessionDescription: String
val game: Game // Mario,GTA,...
}
interface MarioPlayingSession {
val numberOfJumps : Int
val totalMarioScore: Int
val level: MarioLevel
}
- 实施它们(使用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
现在MarioPlayingSessionImpl
和PlayingSessionImpl
都可以放入List<PlayingSession>