2016-03-18 7 views
1

スーパークラスまたは特性を与え、開いた階層を前提として、すべての拡張クラスが特定の型クラスを実装するように強制する方法を教えてください。すべてのサブクラスが特定の型クラスを実装するようにします

trait Super { } 

私は(単独で)以下が許可されていないことを強制したい:

を型クラス Default

trait Default[T] { def default: T } 

、いくつかの形質Superを想定例えば

class A(val i: Int) extends Super 

...以下は、

です。
class B(val i: Int) extends Super 
implicit val bHasDef = new Default[B] { def default = B(42) } 

と仮定すると、Superのメソッドからサブタイプの型クラスの証拠にアクセスできますか?すなわち、のようなもの:

trait Super { 
    def magic: Default[this.type] = ??? 
} 

答えて

0

は、私はほとんどあなたが、少なくとも、単純な十分な方法で、多分それは複雑な型崩れのようなもっと何かで可能だが、それを強制することができると思いません。私はどうなるのか

はスーパー形質にいくつかの変更を加えると、それはまた、これはあなたの質問の後半部分を解決する必要がありDefault

trait Default[T] { def default: T } 

trait Super[T] { 
    self: Default[T] => 
} 

class B(val i: Int) extends Super[Int] with Default[Int] { 
    override def default: Int = ??? 
} 

class A(val i: Int) extends Super[Int] // doesn't compile, needs a Default 

への自己参照を取らせている、不利な点は、今1つの形質でありますもう一方にバンドルされています。

関連する問題