Kotlin:我怎样才能避免构造函数中的代码重复?

时间:2016-01-24 10:01:25

标签: constructor duplicates kotlin code-duplication

我经常发现自己处于一个有很多可选参数的超类的情况下,那些相同的参数也需要在其子类中作为可选参数。

例如,超类:

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)

注意:我会用我的解决方案回答这个问题。我正在寻找更好的解决方案。

2 个答案:

答案 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"

}