Kotlin - заменить делегирование классов - несколько классов с одинаковой функциональностью отличаются сигнатурой - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю с 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 
}

Как я могу сделать это без дублирования блоков кода?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Отвечая на мой собственный вопрос. В итоге я абстрагировал функциональность и создал два отдельных класса с разными сигнатурами, которые расширяют абстрактный класс.

Пример:

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
0 голосов
/ 07 ноября 2018

Просто передайте логический параметр вашему конструктору и используйте его для создания базового или расширенного 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 
}
...