【问题标题】:Kotlin: How can I avoid code duplication in constructors?Kotlin:如何避免构造函数中的代码重复?
【发布时间】:2016-01-24 10:01:24
【问题描述】:

我经常发现自己的超类有很多可选参数,而这些相同的参数在其子类中也需要是可选参数。

例如超类:

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)

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

【问题讨论】:

  • 避免继承的另一个原因 :) 如果这些参数是可选的,为什么还要在构造函数中使用它们呢?相反,您可以在基类中声明常规属性 var optionalProperty:String? = "DefaultValue"

标签: constructor duplicates kotlin code-duplication


【解决方案1】:

我通常解决这个问题的方法是创建一个数据类来表示参数。

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)

【讨论】:

    【解决方案2】:

    就像提到的@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"
    
    }
    

    【讨论】:

    • 如果CyclePlugin不是抽象的,可以用那些可选参数初始化怎么办?
    • 我很好奇我们是否可以在 kotlin 中对 sealed class 做同样的事情
    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2013-07-08
    相关资源
    最近更新 更多