Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin setters/getter元编程问题_Kotlin - Fatal编程技术网

Kotlin setters/getter元编程问题

Kotlin setters/getter元编程问题,kotlin,Kotlin,我想知道是否有一种聪明的方法可以通过元编程在父类中自动生成子类的setter/getter,如下所示: open class TableClass { protected val t: MutableMap<String,Any> = mutableMapOf() fun attribute (k:String,v:Any) { t[k] = v } } class Coordinates () : TableClass() { //

我想知道是否有一种聪明的方法可以通过元编程在父类中自动生成子类的setter/getter,如下所示:

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 // ...
}

谢谢你的关注

与您在这里引用的Python相反,Kotlin是一种强类型语言,因此不可能动态生成属性或字段

您可以使用至少使其更具动态性:

class Coordinates () : TableClass() {
    var x : Int by t
    var y : Int by t
}
它之所以有效,是因为你很幸运;-Kotlin自动提供了一种将属性委托给映射的方法。但是,您仍然必须声明所有必需的属性并将其委托。您还可以实现自己的属性委托器,而不是映射


除此之外,您可以在编译时使用注释处理自动生成Kotlin源代码,但这是一个更长的故事,可能不是您真正想要的。

与Python相反,我相信您在这里引用了Python,Kotlin是一种强类型语言,因此,不可能动态生成属性或字段

您可以使用至少使其更具动态性:

class Coordinates () : TableClass() {
    var x : Int by t
    var y : Int by t
}
它之所以有效,是因为你很幸运;-Kotlin自动提供了一种将属性委托给映射的方法。但是,您仍然必须声明所有必需的属性并将其委托。您还可以实现自己的属性委托器,而不是映射


除此之外,您可以在编译时使用注释处理自动生成Kotlin源代码,但这是一个更长的故事,可能不是您真正想要的。

@mahan我不确定我是否理解您的意思。我只想在子类中为任何创建的属性自动创建getter和setter。父类在创建时应该不知道可能的子类。@mahan我不确定我是否理解您的意思。我只想在子类中为任何创建的属性自动创建getter和setter。父类在创建时应该不知道可能的子类。委托属性可以,谢谢!委托物业就可以了,谢谢!