在 Kotlin 中设计一个通用的 ControlParams 类来处理不同的控制参数,有几种常见的方法:方案1:使用密封类(Sealed Class)
sealed class ControlParams
data class LightControlParams(
val brightness: Int,
val color: String
) : ControlParams()
data class ThermostatControlParams(
val temperature: Double,
val mode: String
) : ControlParams()
data class GenericControlParams(
val parameters: Map<String, Any>
) : ControlParams()
方案2:使用泛型和类型参数
data class DeviceControlBody<T: ControlParams>(
val timestamp: String,
val deviceId: String,
val params: T
)
interface ControlParams
data class LightParams(
val on: Boolean,
val brightness: Int
) : ControlParams
方案3:使用灵活的 Map 结构(最简单通用)
data class ControlParams(
val params: Map<String, Any>
)
// 使用示例
val controlBody = DeviceControlBody(
timestamp = "2023-01-01T00:00:00",
deviceId = "light-123",
params = ControlParams(mapOf(
"brightness" to 80,
"color" to "red"
))
)
方案4:使用 JSON 字符串(与后端交互时常用)
data class ControlParams(
val jsonParams: String
)
// 使用示例
val paramsJson = """{"brightness": 80, "color": "red"}"""
val controlBody = DeviceControlBody(
timestamp = "2023-01-01T00:00:00",
deviceId = "light-123",
params = ControlParams(paramsJson)
)
推荐方案
根据你的具体需求,我推荐以下方案:
如果参数结构明确且类型安全重要:使用密封类方案(方案1)
如果需要最大灵活性:使用 Map 结构(方案3)
如果需要与 REST API 简单交互:使用 JSON 字符串(方案4)
完整示例(推荐方案1 + 方案3结合):
// 基础控制参数接口
interface ControlParams
// 特定设备参数
data class LightControlParams(
val brightness: Int,
val color: String
) : ControlParams
// 通用参数实现
data class GenericControlParams(
val parameters: Map<String, Any>
) : ControlParams
// 设备控制请求体
data class DeviceControlBody(
val timestamp: String,
val deviceId: String,
val params: ControlParams
)
// 使用示例
fun main() {
// 特定设备控制
val lightControl = DeviceControlBody(
"2023-01-01T00:00:00",
"light-123",
LightControlParams(80, "red")
)
// 通用设备控制
val genericControl = DeviceControlBody(
"2023-01-01T00:00:00",
"device-xyz",
GenericControlParams(mapOf("speed" to 5, "mode" to "auto"))
)
}
这种设计既保持了类型安全,又提供了足够的灵活性来处理不同的设备控制参数。