Неуниверсальные подклассы наследуют (реализуют) универсальный суперкласс (интерфейс) - PullRequest
1 голос
/ 05 ноября 2019

Каковы преимущества следующей модели, когда неуниверсальные подклассы имеют родительский универсальный суперкласс / интерфейс?

interface Generic<Q: Number, R: Number> {

    fun calculate(input: Q): R
}

class ClassA: Generic<Int, Int> {

    override fun calculate(input: Int): Int {
        return input
    }
}

class ClassB: Generic<Float, Float> {

    override fun calculate(input: Float): Float {
        return input
    }
}

Полиморфизм в любом случае недоступен (требуется явное приведение с сопоставлением с образцом). Тот же результат можно получить без наследования / реализации:

fun main() {
    val classA: Generic<Int, Int> = ClassA()
    val classB: Generic<Float, Float> = ClassB()
    val inputs: List<Number> = listOf(1, 1.1, 2, 2.2)

    for (input in inputs) {
        when (input) {
            is Int -> classA.calculate(input)
            is Float -> classB.calculate(input)
        }
    }
}

1 Ответ

1 голос
/ 06 ноября 2019

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

Одним из преимуществ использования этого сейчас является то, что теперь у вас есть два одинаковых класса с согласованными именами методов и похожими сигнатурами методов. Унаследовав Generic, можно избежать опечатки от ввода caluclate вместо calculate. Некоторые могут не считать это уважительной причиной, но я бы сказал, что использование этого интерфейса делает ваш код более согласованным в этом случае.

Преимущество использования Generic появляется, когда вам действительно нужно сослаться на него.

interface Calculator<T : Number, K : Generic<T>> {
    fun calculate(generic: K): T
}
class DefaultCalculator...

Приведенный выше код является лишь примером и, вероятно, не практичен в вашем случае использования, но если вы считаете, что он может понадобиться в будущем, использование интерфейса Generic теперь может сэкономить вам некоторый рефакторинг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...