Вопрос о метапрограммировании сеттеров/геттеров Котлина

#kotlin

Вопрос:

Мне было интересно, есть ли умный способ автоматически генерировать сеттеры/геттеры дочернего класса в родительском классе с помощью метапрограммирования, например :

 open class TableClass {
    protected val t: MutableMap<String,Any> = mutableMapOf()
    fun attribute (k:String,v:Any) {
        t[k] = v
    }
}

class Coordinates () : TableClass() {
    //Automatically generate that through metaprogramming in the parent class
    var x : Int
        get() = t["x"] as Int
        set(v)  { this.attribute ( "x", v ) }
    var y : Int // ...
}
 

Спасибо вам за внимание !

Комментарии:

1. @махан, я не уверен, что понимаю, о чем ты говоришь. Я просто хочу автоматизировать создание геттеров и сеттеров в дочернем классе для любого созданного атрибута. Родительский класс не должен знать о возможных дочерних классах при его создании.

Ответ №1:

В отличие от Python, на который, я полагаю, вы ссылаетесь здесь, Kotlin является строго типизированным языком, поэтому невозможно динамически создавать свойства или поля.

Вы можете использовать делегированные свойства, чтобы, по крайней мере, сделать его немного более «динамичным».:

 class Coordinates () : TableClass() {
    var x : Int by t
    var y : Int by t
}
 

Причина, по которой это работает, заключается в том, что вам повезло 😉 Kotlin автоматически предоставляет способ делегирования свойств Map<String,Any> . Но вам все равно придется объявить все необходимые свойства и делегировать их. Вы также можете реализовать свои собственные делегаторы свойств, отличные от карт.

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

Комментарии:

1. Делегированные свойства подойдут, спасибо !