有些問題與這個問題有些相關,但它們似乎不太合適。如何在Scala中使用類型參數聲明匿名mixin
我正在使用Cake模式在生產代碼中滑動「存儲」系統,並在測試目的中存儲存根存儲系統。這非常棒,但是有一個類正在原始類中實例化,這個類還需要混入這個存根存儲系統。由於它隱藏在實現中,因此我無法訪問它。
事情是這樣的:
class Main { this: Storage =>
...
val used = Used(...)
...
}
class Used { this: Storage =>
...
}
當測試 「已使用」 我只是new Used with StubStorage
和關閉我去。我曾經在Main
上做過同樣的事情,但那是在使用Used
之前。現在Main
做出了一個天真的例子Used
我有這個問題。
我想試試這樣說:
class Main[T <: Storage] { this: T =>
...
val used = Used[T](...)
...
}
class Used[T <: Storage] { this: T =>
...
}
object Used {
def apply[T <: Storage](...) = new Used(...) with T
}
當然,因爲編譯器沒有足夠的信息來發現T
不工作,但。這是否有一個神奇的祕訣?我已經玩了一下,看起來很麻煩,標準的面向對象注入方法實際上沒有那麼麻煩,但我可能會錯過一些東西。
我已經看過隱含的工廠概念,但我不能把它變成爲mixin工作的形狀。
編輯:這是公開寫出問題的清晰度令人驚訝。 :)我還沒有解決的問題,我原本打算的方式,但有一個簡單的解決實際問題:
trait UsedProvider {
def createUsed = Used.apply _
}
class Main { this: Storage with UsedProvider =>
val used = createUsed(...)
}
那我就只是做測試如下:new Main with StubStorage with StubUsedProvider
。
這將只允許我創建一個,我需要一個以上的,這是不是在原來的問題是清楚的。我需要的是一種工廠方法,允許我在需要時創建它們。所以我只是再次使用好的蛋糕模式來給我這種依賴。 – 2011-06-01 10:16:31