scala - 具有依赖特征和依赖实现的设计问题

标签 scala

我有以下设计问题:

/**
 * Those 2 traits are the public API
 */
trait Box {
  def include(t: Token): Box
}
trait Token

/**
 * Implementation classes
 */
case class BoxImpl(id: Int) extends Box {
  /**
   * the implementation of this method depends on the implementation
   * of the Token trait
   * TODO: REMOVE asInstanceOf
   */
  def include(t: Token) = BoxImpl(t.asInstanceOf[TokenImpl].id + id)
}
case class TokenImpl(id: Int) extends Token

// use case
val b: Box = new BoxImpl(3)
val o: Token = new TokenImpl(4)

// == BoxImpl(7)
b.include(o)

在上面的代码中,我不想在公共(public)API中公开id(甚至不将其设置为private[myproject],因为这仍然会包含循环我的项目中的依赖项)。

如何才能保持公共(public) API 完整,同时让实现类彼此具有一定的可见性(没有丑陋的强制转换)?

最佳答案

输入参数或成员:

trait Box {
  type T <: Token
  def include(t: T): Box
  //def include(t: Token): Box
}
trait Token

case class BoxImpl(id: Int) extends Box {
  type T = TokenImpl
  def include(t: T) = BoxImpl(t.id + id)

  /*
  def include(t: Token) = t match {
    case ti: TokenImpl => BoxImpl(ti.id + id)
    case _ => throw new UnsupportedOperationException
  }
  */

  //def include(t: Token) = BoxImpl(t.asInstanceOf[TokenImpl].id + id)
}
case class TokenImpl(id: Int) extends Token

有很多方法可以将其切片和切 block ,因此蛋糕图案,众所周知的小菜一碟:

trait Boxer {
  type Token <: Tokenable
  trait Box {
    def include(t: Token): Box
  }
  trait Tokenable
}

trait Boxed extends Boxer {
  type Token = TokenImpl
  case class BoxImpl(id: Int) extends Box {
    override def include(t: Token) = BoxImpl(t.id + id)
  }
  case class TokenImpl(id: Int) extends Tokenable
}

trait User { this: Boxer =>
  def use(b: Box, t: Token): Box = b.include(t)
}

object Test extends App with Boxed with User {
  val b: Box = new BoxImpl(3)
  val o: Token = new TokenImpl(4)
  println(use(b, o))
}

关于scala - 具有依赖特征和依赖实现的设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13079359/

相关文章:

scala - 在 Scala 中使用反射的奇怪行为

java - Scala中的排序方法

scala - Spark : Dataframe Serialization

java - JVM 语言互操作性

scala - 如何在 slick 之上创建一个可以全局应用的缓存层?

Scalatest 中止的测试处理

scala - 参数 : _* mean in Scala? 是什么意思

scala - 即使列不在数据框中,Spark 也会下推过滤器

scala - Akka SLF4J 和 Scala 中的 logback

java - 如何在 Scala 中流式传输标准输出?