當我有以下代碼時,我認為有些東西我不太明白:
trait Configuration[F[_]] {
def get(key: String): F[ConfigValue]
}
class InMemoryConfig extends Configuration[Option] {
override def get(key: String): Option[ConfigValue] = ???
}
class InFileConfig(path: String) extends Configuration[Try] {
override def get(key: String): Try[ConfigValue] = ???
}
trait Logging {
def config: Configuration[_] // does not work
// ...
}
class DefaultLogging {
override val config = new InMemoryConfig
// ...
}
類的名稱幾乎沒有意義,一般目標是在不定義引數型別的情況下在特征中擁有一個成員,以便將選擇延遲到實作(實際上是在DefaultLogging類中)。
uj5u.com熱心網友回復:
由于Logging不知道將使用哪種型別的建構式,Configuration它必須像任何其他型別引數一樣繼承它。
因此:
trait Logging[F[_]] {
def config: Configuration[F]
// ...
}
這同樣適用于任何依賴Logging它需要指定型別或保持依賴關系的東西。
因此,一個常見的觀察結果是是否需要這種直接依賴,但這成為設計問題,有時是個人喜好問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419709.html
標籤:
