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) 
Interesting Posts