scala - Scala中的家庭多态性

标签 scala polymorphism

目前推荐的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
}

可以根据以下特征来表达特定的游戏(在本示例中为扑克):
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 = ...
}

我对此设置有几个疑问:
  • 用英语发音“Game[G <: Game[G]]”吗?在这种情况下GGame扮演的角色的名称是什么? (特别是在这种“递归”关系中。)
  • 这是“家庭多态性”的合理实现吗?从高层次来看,我的理解是,这意味着游戏及其玩家和国家必须作为一个“家庭”而变化。我在其他地方看到过的Scala家庭多态性的看法有很大不同,并且我不清楚在不同的权衡下:
  • Scala概述(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界多态性或其他任何事物的家庭多态性方法。
  • 最佳答案

    我会质疑是否有必要在特征的“外部”定义所有类。 PlayerState类型已经依赖于Game,因此您无需尝试进一步限制它。

    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
    }
    

    如果需要,可以使用蛋糕图案将不同的部分分离为不同的特征/文件。
    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 = ...
    }
    

    关于scala - Scala中的家庭多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14133748/

    相关文章:

    scala - Distinct 在 scala 中的数组返回一个空字符串

    scala - 如何在向量列中找到最大值的索引?

    java - 是否有用于解析 gettext PO 文件的 Java 库?

    c++ - 在 C++ 中复制一个未知的具体类型

    java - 这段代码的行为有什么不同?

    java - 扩展泛型

    scala - 如果参数不是无,如何有选择地更新字段

    斯卡拉 REPL : Where to find documentation on particular command?

    nhibernate - 使用 NHibernate 正确映射多态关系

    c# - 序列化具有相同类型名称的多态列表