Ada*_*gel 9 polymorphism scala
目前推荐的Scala家族多态性模式是什么?
在尝试建模游戏的方法时,最近出现了这个解决方案:
trait Game[G <: Game[G]] {
type PLAYER <: Player[G]
type STATE <: State[G]
def players(): Set[G#PLAYER]
def startState(): G#STATE
}
trait Player[G <: Game[G]]
trait State[G <: Game[G]] {
def player(): G#PLAYER
}
Run Code Online (Sandbox Code Playgroud)
特定游戏(本例中的扑克)可以用这样的特征来表达:
class Poker() extends Game[Poker] {
type PLAYER = PokerPlayer
type STATE = PokerState
val p1 = new PokerPlayer()
def players() = Set(p1)
def startState(): PokerState = ...
}
class PokerPlayer() extends Player[Poker]
class PokerState() extends State[Poker] {
def player(): PokerPlayer = ...
}
Run Code Online (Sandbox Code Playgroud)
我有几个关于此设置的问题:
Game[G <: Game[G]]发音如何用英语发音?什么是该角色的名称G和Game正在发挥这种情况呢?(具体在这个"递归"关系中有意义.)
这是"家庭多态性"的合理实施吗?在高层次上,我的理解是,这意味着游戏及其玩家和国家必须作为"家庭"而变化.我在其他地方看到的Scala中的家族多态性差异很大,我不清楚不同的权衡:
Scala Overview(2006)http://www.scala-lang.org/docu/files/ScalaOverview.pdf
Martin Kneissl博客(2009年)http://www.familie-kneissl.org/Members/martin/blog/family-polymorphism-in-scala
讨论涉及类型,宏,f-有界多态或其他任何事物的家族多态的方法是受欢迎的.
我会质疑是否需要在特征“外部”定义类。类型Player和State已经依赖于游戏,因此您无需尝试进一步限制它。
trait Game {
type Player
type State <: StateLike
trait StateLike {
def player: Player
}
def startState: State
}
class Poker extends Game {
class Player
class State extends StateLike { ... }
val startState = new State
}
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以使用蛋糕模式将不同的部分分成不同的特征/文件。
trait PokerPlayer extends Game {
class Player
}
trait PokerState extends Game with PokerPlayer {
class State extends StateLike { ... }
}
class Poker extends Game with PokerPlayer with PokerState {
val startState = ...
}
Run Code Online (Sandbox Code Playgroud)