Можно ли расширить класс Kotlin для соответствия интерфейсу (как это может сделать класс Swift)? - PullRequest
0 голосов
/ 05 июля 2018

В Swift я могу создать протокол, который делает что-то вроде

protocol FoobarConvertible {
    var foobar:String { get }
}

А затем расширить любой класс в системе с помощью соответствующей реализации

extension String : FoobarConvertible {
    var foobar:String {
        get {
            return "foobar"
        }
    }
}

В Kotlin, я думаю, интерфейсы похожи на протоколы (?), И я могу объявить один из них следующим образом

protocol FoobarConvertible {
    val foobar:String
}

Но что не очевидно для меня из документации (которая кажется кратким упражнением), так это то, как я расширил бы класс String Котлина, чтобы он соответствовал FoobarConvertible. Очевидно, я мог бы просто добавить метод расширения к строке Kotlin

val String.foobar:String
    get() = "foobar"

Но это не позволяет использовать строки в качестве параметров, где FoobarConvertible является ожидаемым типом.

1 Ответ

0 голосов
/ 05 июля 2018

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

Однако интерфейсы не могут быть добавлены к существующим классам, которые вы, возможно, не компилируете сами - эта функция была бы не просто синтаксическим сахаром. (На JVM, по крайней мере.)

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