0

traitsこのようなものから拡張されたいくつかのスタック可能をテストしたい:

trait Layer{
  def write(s:String): String
}

それぞれが着信文字列を何らかの方法で処理し、次のレイヤーに渡します。次に例を示します。

trait TimeStampLayer { 
  abstract override def write(s:String) = System.nanotime + super.write(s)
} 

私の考えは、そのようなフィクスチャを持つ基本テストクラスを書くことでした:

abstract LayerTest { 

   type L

   val layer = new BaseLayer with L      // BaseLayer would be one that does nothing

} 

各テスト サブクラスはL、そのような stackable で上書きされますtraitLこれはもちろん機能しません。なぜなら、それが特性であることを指定する制約がないからです。コンパイラを引用すると、

タイプ L は、混合する特性である必要があります

みたいなことも考えました

abstract LayerTest[L <: Layer] {
  //...
}

class TimeStampLayerTest extends LayerTest[TimeStampLayer] {}

しかし、私は特性であることを強制することもできませんL、または少なくとも方法がわかりません

型が特性であることを指定する方法はありますか?

4

1 に答える 1

1

Lコードの問題は、それが特性であることを指定するための型制約を欠いているだけではありません。それができたとしても、コンパイラは何をすべきでしょうか? new演算子を使用する場合、型は完全に既知である必要がありますが、ここLでは抽象型であるためnew BaseLayer with L、 を呼び出す時点では完全に不明ですnew。したがって、コンパイラがここで何をすべきかを知る方法はありません。

すべきことは、単純にlayer抽象化して、具体的なサブクラスにインスタンス化を実行させることです。

trait Layer{
  def write(s: String): String
}
trait TimeStampLayer extends Layer{ 
  abstract override def write(s: String) = System.nanoTime + super.write(s)
} 
trait BaseLayer extends Layer {
  def write(s: String) = s
}
abstract class LayerTest { 
   type L <: Layer
   val layer: L // Note that this is abstract
}
class MyTest extends LayerTest {
  class L extends BaseLayer with TimeStampLayer
  val layer = new L // We instantiate it here in the conrete test
}

同じ名前の具象クラスによって抽象型を直接実装できるという事実を使用した痛みを和らげることに注意してください(class L extends ...

于 2013-07-12T09:45:20.763 に答える