【问题标题】:Kotlin - Replace class delegation - Multiple classes with same functionality different signatureKotlin - 替换类委托 - 具有相同功能的多个类不同的签名
【发布时间】:2019-04-11 02:15:42
【问题描述】:

我正在使用 JunitRules RuleChain 和 Kotlin。我对两者都是新手,并且有两个类做完全相同的事情,唯一的区别是规则链。

第一堂课是这样的:

class BaseActivityTestRule<T : Activity>(
    private val activityRule : ActivityRule<T>
) : TestRule by RuleChain.outerRule(CustomRuleOne).around(activityRule) {

    // do something 
}

我需要另一个类与BaseActivityTestRule 执行完全相同的操作,但委托不同。

例子:

class ExtendedActivityTestRule<T : Activity>(
    private val activityRule : ActivityRule<T>
) : TestRule by RuleChain.outerRule(CustomRuleOne).around(CustomRuleTwo).around(activityRule) {

    // do something 
}

如何在不复制代码块的情况下完成此操作?

【问题讨论】:

    标签: kotlin delegation junit-rule


    【解决方案1】:

    只需将布尔参数传递给您的构造函数并使用它来创建基本或扩展TestRule

    fun <T> createTestRule(activityRule: ActivityRule<T>, extended: Boolean) = 
        if(extended) 
            RuleChain.outerRule(CustomRuleOne).around(CustomRuleTwo).around(activityRule)
        else
            RuleChain.outerRule(CustomRuleOne).around(activityRule)
    
    class ActivityTestRule<T : Activity>(
        private val activityRule : ActivityRule<T>,
        extended: Boolean = false
    ) : TestRule by createTestRule(activityRule, extended) {
    
        // do something 
    }
    

    【讨论】:

      【解决方案2】:

      回答我自己的问题。我最终抽象了功能并创建了两个具有不同签名的独立类来扩展抽象类。

      例子:

      abstract class BaseActivityTestRule<T : Activity>(
      private val activityRule : ActivityRule<T>){  
       // Do Something 
      }
      

      然后扩展它:

      class ExtendedActivityTestRule<T : Activity>(
      private val activityRule : ActivityRule<T>): BaseActivityTestRule<T>(activityRule), TestRule by Delegate 
      

      对于后续实现:

      class DifferentActivityTestRule<T : Activity>(
      private val activityRule : ActivityRule<T>): BaseActivityTestRule<T>(activityRule), TestRule by SomeOtherDelegate
      

      【讨论】:

        猜你喜欢
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多