簡體   English   中英

如何在 Scala 中使用類型參數聲明匿名 mixin

[英]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之前。 現在MainUsed進行了天真的實例化,我遇到了這個問題。

我想這樣嘗試:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM