Ограничение типа сопутствующего объекта в Котлине - PullRequest
2 голосов
/ 21 сентября 2019

Я хочу создать интерфейс с методом печати, который будет печатать значение, за которым следует суффикс.Итак:

interface Unitary<T>{
    val value: T
    fun print(){
        print(value)
        println(suffix)
    }
}

interface HasSuffix{
    val suffix: String
} 

inline class Centimeters(val value: Double): Unitary<Double>{
    companion object: HasSuffix{
        override val suffix = "cm"
    }
} 

В настоящее время я получаю сообщение об ошибке:

Неразрешенная ссылка: суффикс

Есть ли способ указать, что суффикс будетбыть объявленным в объекте-компаньоне любого реализующего интерфейса?

Ответы [ 2 ]

5 голосов
/ 21 сентября 2019

Есть ли способ указать, что суффикс будет объявлен на объекте-компаньоне любого реализующего интерфейса?

Я не думаю, что есть.

Выможет обойти это с чем-то вроде:

interface Unitary<T>{
    val value: T

    fun suffixProvider() : SuffixProvider

    fun print(){
        print(value)
        println(suffixProvider().suffix)
    }
}

interface SuffixProvider{
    val suffix: String
} 

inline class Centimeters(override val value: Double): Unitary<Double>{
    companion object: SuffixProvider{
        override val suffix = "cm"
    }

    override fun suffixProvider() = Centimeters

} 
2 голосов
/ 21 сентября 2019

Вы не можете заставить подклассы предоставлять определенную функциональность, а именно через сопутствующие объекты.Вместо этого вы можете заставить их предоставить определенные методы.Как классы реализуют этот метод, зависит от них.

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