Scala "multilevel"抽象类/抽象对象替换

标签 scala inheritance

我使用非常方便的 Scala 对象结构来捕获我的设置,如下所示

object Settings {
    object ObjectSever {
       val URL = "http://localhost:8081"
       val timeout = 20
    }
    object ConnectionPools {
       object Limits {
          val timeout = 10
          val max = 5
          val prefix = "pref_"
       }
    }
} 

但是,我需要拥有以下结构的多个实例,用于测试、不同的配置提供程序等。 所以我尝试用这样的结构构建一个抽象类,但是失败了。 我可以轻松地用抽象类替换Settings,但是如何重现如此漂亮的嵌套结构呢? 我还想保持编译类型的安全性 - 当我错过子类等中的某些元素时会出现错误。

最佳答案

我认为这里不需要抽象类,因为您似乎只想要一个不可变的数据结构,而没有任何实际的继承。嵌套案例类应该做得很好。

case class Settings(server: ObjectServer, connectionPools: ConnectionPools)
case class ObjectServer(URL: String, timeout: Int)
case class ConnectionPools(limits: Limits)
case class Limits(timeout: Int, max: Int, prefix: String)

val settings = Settings(
    ObjectServer(
        URL = "http://localhost:8081",
        timeout = 20
    ),
    ConnectionPools(
        Limits(
            timeout = 10,
            max = 5,
            prefix = "pref_"
        )
    )
)

无论如何,这是一种使用抽象类和这些类的匿名实例化的方法:

abstract class Settings {
    val server: ObjectServer
    val connectionPools: ConnectionPools
}

abstract class ObjectServer {
    val URL: String
    val timeout: Int
}

abstract class ConnectionPools {
    val limits: Limits
}

abstract class Limits {
    val timeout: Int
    val max: Int
    val prefix: String
}

object MySettings extends Settings {
    val server = new ObjectServer {
       val URL = "http://localhost:8081"
       val timeout = 20
    }

    val connectionPools = new ConnectionPools {
        val limits = new Limits {
            val timeout = 10
            val max = 5
            val prefix = "pref_"
        }
    }
 }

关于Scala "multilevel"抽象类/抽象对象替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690763/

相关文章:

Scalacheck:生成与生成器列表相对应的列表

c# - C# 中的虚函数

ASP.NET 页面继承

scala - 为什么 Scala 为 Short 和 Byte 类型定义了一个 "+="运算符?

sql - 如何在 Slick Queries 中使用简单的数学运算

scala - NoClassDefFoundError:SparkSession-即使构建正常

scala - 重构一个小型 Scala 函数

c++ - 相同成员函数的公有和私有(private)访问

C++ 隐式和显式继承构造函数调用

java - 当从 super() 运行方法时,为什么不将字段初始化为非默认值?