[英]Reference outside the sealed class in Kotlin?
我正在尝试创建一个类,该类使用其自己的状态对持有引用的外部对象的状态进行操作。 外部对象可以是A或B类,这是相似的,但不受作者控制。 因此,根据@ SimY4的早期答案 ,将创建一个密封的类来访问它们的公共属性。
// *** DOES NOT COMPILE ***
class A { // foreign class whose structure is not modifiable
val prop get()= "some string made the Class-A way"
}
class B { // foreign class whose structure is not modifiable
val prop get()= "some string made the Class-B way"
}
data class ABTool (val obj:AB, val i:Int, val j:Int) {
// class that manipulates i and j and uses them to do
// things with AB's "common" attributes through the sealed class AB
sealed class AB { // substitute for a common interface
abstract val prop: String
abstract val addmagic: String
data class BoxA(val o:A) : AB() {
override val prop get()= o.prop
override val addmagic get() = prop + this@???.magic // HOW TO REFERENCE?
}
data class BoxB(val o:B) : AB() {
override val prop get()= o.prop
override val addmagic get() = this@???.magic + prop // HOW TO REFERENCE?
}
}
val magic get()= "magic: ${i*j}"
}
现在的问题是,我发现我无法以自己想要的方式对外部对象进行操作,因为密封类无法引用其外部类成员。 即使使用其他方法(不使用密封类),有没有更好的方法可以使这项工作完成,而:
对这个或类似的解决方法有什么想法? 也许我还没有想到一种更实用的方法?
如果您可以放弃ABTool
作为密封类,那么可以采用以下解决方案:
ABTool
声明中用inner abstract
替换sealed
; BoxA
和BoxB
标记为inner
; data class ABTool(val obj: AB, val i: Int, val j: Int) {
inner abstract class AB {
abstract val prop: String
abstract val addmagic: String
inner class BoxA(val o: A) : AB() {
override val prop get() = o.prop
override val addmagic get() = prop + magic
}
inner class BoxB(val o: B) : AB() {
override val prop get() = o.prop
override val addmagic get() = magic + prop
}
}
val magic get() = "magic: ${i * j}"
}
(或者,将BoxA
和BoxB
移出ABTool
范围,而不是将AB
标记为内部)
一种替代方法是将ABTool
字段添加到AB
:
sealed class AB(val tool: ABTool) {
abstract val prop: String
abstract val addmagic: String
data class BoxA(val o:A, tool: ABTool) : AB(tool) {
override val prop get()= o.prop
override val addmagic get() = prop + tool.magic
}
data class BoxB(val o:B, tool: ABTool) : AB(tool) {
override val prop get()= o.prop
override val addmagic get() = tool.magic + prop
}
}
并通过this
从创建时ABTool
。 毕竟,那才是inner
真正所做的。
在此特定情况下,该字段恰好在AB
本身中未使用,因此您可以从那里将其删除并在BoxA
和BoxB
val
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.