我想通过将现有类扩展为匿名对象来动态实现接口。这个匿名对象捕获一个方法参数来实现接口方法:
fun myFunc(someObj: SomeObj, update: Boolean) = object : SomeObj(/*copy some values from someObj*/), SomeInterface {
override fun doUpdate() = update
}
此实现捕获update
方法参数,并将其作为合成$update
字段添加到匿名对象中。我需要对该字段进行注释,因为我的序列化框架包括未标记为@Transient
的$update
字段。
代表团的另一种做法也面临同样的问题:
fun myFunc(someObj: SomeObj, update: Boolean) {
val someInterfaceImpl = object : SomeInterface {
override fun doUpdate() = update
}
return object : SomeObj(/*copy some values from someObj*/), SomeInterface by someInterfaceImpl
}
我不能用@delegate:Transient
或@Transient
在任何地方注释someInterfaceImpl
。本质上:
- 有没有一种方法可以在Kotlin中注释捕获的变量
- 在委派给对象时,是否有方法对字段进行注释
我需要通过注释来做到这一点,因为框架不提供任何其他方式来排除字段,甚至不提供名称。
此外,我说的不是委托属性,而是委托接口。
创建一个命名类:
fun myFunc(someObj: SomeObj, update: Boolean): SomeObj {
class SomeObjSubclass(someObj: SomeObj, @Transient val update: Boolean):
SomeObj(someObj.prop1, someObj.prop2, /* and so on*/), SomeInterface {
override fun doUpdate() = update
}
return SomeObjSubclass(someObj, update)
}
请注意,myFunc
现在只是SomeObj
的包装器。根据您的设计,您可以将myFunc
改为SomeObj
子类:
class MyFunc(someObj: SomeObj, @Transient val update: Boolean):
SomeObj(someObj.prop1, someObj.prop2, /* and so on*/), SomeInterface {
override fun doUpdate() = update
}
调用方将调用MyFunc(...)
,就好像它是一个函数一样,并且他们将接收可分配给SomeObj
的东西,就像以前一样。
您还可以向SomeObj
添加一个使用SomeObj
的二级构造函数,并将属性复制到
constructor(someObj: SomeObj): this(
someObj.prop1, someObj.prop2, /* and so on */
)
那么MyFunc
的声明就可以是:
class MyFunc(someObj: SomeObj, @Transient val update: Boolean):
SomeObj(someObj), SomeInterface {
override fun doUpdate() = update
}