次の設計上の問題があります。
/**
* 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)
上記のコードでは、パブリック API で公開したくありません(プロジェクトに循環依存関係が含まれるためid
、公開 API として設定することさえしません)。private[myproject]
実装クラスが互いにある程度の可視性を持っている間 (醜いキャストなしで)、パブリック API をそのままにしておく方法は何でしょうか?