Generics Kotlin从不同类转发属性的惯用方法

Generics Kotlin从不同类转发属性的惯用方法,generics,kotlin,reflection,delegates,Generics,Kotlin,Reflection,Delegates,例如: class A { var value: String get() = "value" set(value) { println(value) } } class B { val a = A() var value = a.value } fun main(args: Array<String>) { B().value = "new value" } 是否有用于此目的的内置委托?如果不是,我如何避免kotlin

例如:

class A {    
    var value: String
    get() = "value"
    set(value) { println(value) }
}

class B {
    val a = A()
    var value = a.value
}

fun main(args: Array<String>) {
    B().value = "new value"
}

是否有用于此目的的内置委托?如果不是,我如何避免
kotlin reflect
依赖关系?

如果
thisRef
必须像
Any
一样通用,那么我认为您无法在没有反射的情况下访问其属性

如果您愿意引入额外的接口,您可能可以按照以下思路做一些事情:(对
kotlin.reflect
仍然存在导入依赖关系,但这是
委托
API所必需的)

导入kotlin.reflect.KProperty
接口HasA{
值存取器
}
接口值存取器{
var值:T
}
类可转发{
运算符fun setValue(thisRef:HasA,属性:KProperty,值:T){
thisRef.a.值=值
}
运算符fun getValue(thisRef:HasA,属性:KProperty):T{
返回此参考值
}
}
A类:ValueAccessor{
覆盖变量值:String=“value”
}
B类:哈萨{
覆盖值a=a()
ForwardMutable()的var值
}
趣味主线(args:Array){
val b=b()
b、 value=“new value”//calls A.value.setter
打印(b值)
}

如果
thisRef
必须像
任何
一样通用,那么我认为您无法在没有反射的情况下访问它的属性

如果您愿意引入额外的接口,您可能可以按照以下思路做一些事情:(对
kotlin.reflect
仍然存在导入依赖关系,但这是
委托
API所必需的)

导入kotlin.reflect.KProperty
接口HasA{
值存取器
}
接口值存取器{
var值:T
}
类可转发{
运算符fun setValue(thisRef:HasA,属性:KProperty,值:T){
thisRef.a.值=值
}
运算符fun getValue(thisRef:HasA,属性:KProperty):T{
返回此参考值
}
}
A类:ValueAccessor{
覆盖变量值:String=“value”
}
B类:哈萨{
覆盖值a=a()
ForwardMutable()的var值
}
趣味主线(args:Array){
val b=b()
b、 value=“new value”//calls A.value.setter
打印(b值)
}

也许我误解了什么,但是,如果您能够提取要委托给内部实例的变量接口,那么为什么不直接使用委托呢

interface SomethingWithValues{
    var value: String
    var value2: String
    var value3: String
}

class A : SomethingWithValues{
    override var value: String = "value"
        set(value) {print(value)}
    override var value2: String = "value2"
        set(value) {print(value)}
    override var value3: String = "value3"
        set(value) {print(value)}
}

class B(val a:A = A()): SomethingWithValues by a

fun main(args: Array<String>) {
    val b = B()
    b.value = "new value"
    b.value2 = "new value2"
    b.value3 = "new value3"
}
interface something with value{
变量值:字符串
var value2:字符串
var value3:字符串
}
A类:有价值的东西{
覆盖变量值:String=“value”
设置(值){打印(值)}
覆盖变量value2:String=“value2”
设置(值){打印(值)}
覆盖变量value3:String=“value3”
设置(值){打印(值)}
}
类B(val a:a=a()):由a指定的具有值的东西
趣味主线(args:Array){
val b=b()
b、 value=“新值”
b、 value2=“新值2”
b、 value3=“新值3”
}

也许我误解了什么,但是,如果您能够提取要委托给内部实例的变量接口,那么为什么不直接使用委托呢

interface SomethingWithValues{
    var value: String
    var value2: String
    var value3: String
}

class A : SomethingWithValues{
    override var value: String = "value"
        set(value) {print(value)}
    override var value2: String = "value2"
        set(value) {print(value)}
    override var value3: String = "value3"
        set(value) {print(value)}
}

class B(val a:A = A()): SomethingWithValues by a

fun main(args: Array<String>) {
    val b = B()
    b.value = "new value"
    b.value2 = "new value2"
    b.value3 = "new value3"
}
interface something with value{
变量值:字符串
var value2:字符串
var value3:字符串
}
A类:有价值的东西{
覆盖变量值:String=“value”
设置(值){打印(值)}
覆盖变量value2:String=“value2”
设置(值){打印(值)}
覆盖变量value3:String=“value3”
设置(值){打印(值)}
}
类B(val a:a=a()):由a指定的具有值的东西
趣味主线(args:Array){
val b=b()
b、 value=“新值”
b、 value2=“新值2”
b、 value3=“新值3”
}

谢谢,但我正在寻找更轻量级的方法。定义接口(基本上是契约)对于简单的属性访问来说(似乎不是这样)太多了。在最坏的情况下,我可以只写
var-value:String get()=a.value;set(value){a.value=value}
,但我想用委托来概括它。通过暴露该属性的接口;B通过反射。选择你的毒药。:-)谢谢,但我正在寻找更轻量级的方法。定义接口(基本上是契约)对于简单的属性访问来说(似乎不是这样)太多了。在最坏的情况下,我可以只写
var-value:String get()=a.value;set(value){a.value=value}
,但我想用委托来概括它。通过暴露该属性的接口;B通过反射。选择你的毒药。:-)这是一个选择。但不幸的是,如果:1。我没有自己的类
A
。2.我想用不同的名字装饰房子。好吧,问题1是不可避免的,但问题2。。。我非常喜欢你的
可转发的
解决方案。为什么不反思?我的意思是,你能想象不用任何语言思考就能解决这个问题吗?即使kotlin库开箱即用地提供了这种类型的属性委托,我很确定它会使用反射。在Kotlin中,它是静态地绑定到委托属性的,所以它没有那么糟糕。但由于Kotlin是JVM语言(基本上解析为Java),所以(有时)可以用静态代码替换动态代码。例如,Kotlin可以有语法
var-value:String-watch a::value
,它将生成setter和getter java代码,不涉及反射,但这只是我目前的梦想。耶,公平点,我忘记了这一切都是为了避免编写kotlin已经提供的一些语法糖;)@xinaiz我认为您现有的实现很好,没有语言构造,如果您正在尝试建议编译时构造,那么可能会在jetbrains kotlin论坛中提出它?这是一个选项
interface SomethingWithValues{
    var value: String
    var value2: String
    var value3: String
}

class A : SomethingWithValues{
    override var value: String = "value"
        set(value) {print(value)}
    override var value2: String = "value2"
        set(value) {print(value)}
    override var value3: String = "value3"
        set(value) {print(value)}
}

class B(val a:A = A()): SomethingWithValues by a

fun main(args: Array<String>) {
    val b = B()
    b.value = "new value"
    b.value2 = "new value2"
    b.value3 = "new value3"
}