2011-05-31 64 views
3

有些問題與這個問題有些相關,但它們似乎不太合適。如何在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

回答

0

我還沒有解決您的原始問題,但是您是否考慮過使用抽象類Main並在需要時提供used的值?

abstract class Main { this: Storage => 
    val s = "s" 
    val used: Used 
} 

然後實例是這樣的:

val main = new Main with StubStorage { val used = new Used(s) with StubStorage } 
+0

這將只允許我創建一個,我需要一個以上的,這是不是在原來的問題是清楚的。我需要的是一種工廠方法,允許我在需要時創建它們。所以我只是再次使用好的蛋糕模式來給我這種依賴。 – 2011-06-01 10:16:31