Kotlin - заменить делегирование классов - несколько классов с одинаковой функциональностью отличаются сигнатурой
Я работаю с 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 ответа
Решение
Просто передайте логический параметр вашему конструктору и используйте его для создания основного или расширенного 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
}
Отвечая на мой собственный вопрос. В итоге я абстрагировал функциональность и создал два отдельных класса с разными сигнатурами, которые расширяют абстрактный класс.
Пример:
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