我经常发现自己处于一个有很多可选参数的超类的情况下,那些相同的参数也需要在其子类中作为可选参数。
例如,超类:
abstract class Plugin(val name: String, val version: String = "1.0",
val author: String = "", val description: String = "")
扩展这个课程很痛苦。这是一个示例子类:
abstract class CyclePlugin(name: String, version: String = "1.0", author: String = "",
description: String = "", val duration: Int, val durationUnit: TimeUnit
= MILLISECONDS) : Plugin(name, version, author, description)
注意:我会用我的解决方案回答这个问题。我正在寻找更好的解决方案。
答案 0 :(得分:6)
我通常解决这个问题的方法是创建一个数据类来表示参数。
data class PluginInfo(val name: String, val version: String = "1.0",
val author: String = "", val description: String = "")
然后我将此类作为构造函数中的参数。
abstract class Plugin(val info: PluginInfo)
abstract class CyclePlugin(info: PluginInfo, val duration: Int,
val durationUnit: TimeUnit = MILLISECONDS) : Plugin(info)
然后可以像这样实现一个示例插件:
class ExamplePlugin : CyclePlugin(PluginInfo("Example Plugin", author = "Jire"), 8, TimeUnit.SECONDS)
答案 1 :(得分:5)
与提到的@miensol类似,您可以在构造函数之外定义属性。
abstract class Plugin(val name: String) {
open val version: String = "1.0"
open val author: String = ""
open val description: String = ""
}
然后,您只能使用必要的CyclePlugin
参数定义name
:
abstract class CyclePlugin(name: String, val duration: Int,
val durationUnit: TimeUnit = MILLISECONDS) : Plugin(name)
然后,例如,您可以覆盖ExamplePlugin
的某些字段:
class ExamplePlugin : CyclePlugin("Example Plugin", 8, TimeUnit.SECONDS) {
override val author = "Giovanni"
override val description = "This is an example plugin"
}