Kotlin:我如何避免构造函数中的代码重复?
通常我发现自己处于一个拥有大量可选参数的超类的情况,这些相同的参数在其子类中也需要是可选参数。
例如,超类:
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)
注意:我将用我的解决方案回答这个问题。 我正在寻找更好的解决方案。
像@ miensol提到的,你可以在构造函数之外定义你的属性。
abstract class Plugin(val name: String) { open val version: String = "1.0" open val author: String = "" open val description: String = "" }
然后,您可以仅使用必要的name
参数来定义CyclePlugin
:
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" }
我通常解决这个问题的方法是创建一个数据类来表示参数。
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)