[英]How to declare anonymous mixin using a type parameter in Scala
有人提出了一些與此問題有些相關的問題,但它們似乎不太合適。
我正在使用 Cake 模式在生產代碼中滑動“存儲”系統,並使用存根存儲系統進行測試。 這一切都很好,但是有一個 class 正在原始 class 中實例化,它還需要混入這個存根存儲系統。由於它隱藏在實現中,我無權訪問它。
事情看起來像這樣:
class Main { this: Storage =>
...
val used = Used(...)
...
}
class Used { this: Storage =>
...
}
當測試“二手”時,我只是簡單地new Used with StubStorage
和關閉我 go。 我曾經對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
。 這有什么神奇的秘訣嗎? 我已經玩了一段時間,它似乎很麻煩,標准的 OO 注入方法實際上不那么麻煩,但我可能會遺漏一些東西。
我看過隱含的 Factory 概念,但我無法將其轉化為適用於 mixins 的形狀。
編輯:公開寫這個問題的清晰度令人驚訝。 :) 我沒有按照我最初打算的方式解決問題,但是對於實際問題有一個簡單的解決方案:
trait UsedProvider {
def createUsed = Used.apply _
}
class Main { this: Storage with UsedProvider =>
val used = createUsed(...)
}
然后我將在測試中執行以下操作: new Main with StubStorage with StubUsedProvider
。
我也沒有解決您最初的問題,但您是否考慮過使用抽象 class 作為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 }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.