我正在尝试创建一个类,它使用自己的状态来操作它所引用的外部对象的状态。外部对象可以是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}"
}
现在的问题是我发现我无法按照我想要的方式操作外部对象,因为密封类无法引用其外部类成员。即使使用不同的方法(密封类除外),是否有更好的方法来完成这项工作,同时:
- 不改变国外A类或B类;
- 考虑到 A 和 B(以及实际情况中的许多其他情况)是相似的,因此我尝试编写一个工具,使用相同的代码库来计算 A 和 B 并为其添加魔力;和
- 请注意,虽然 ABTool 工具是相同的,但它们用于添加魔法的方式在 A 和 B 中略有不同,就像访问 A 和 B 的概念上共同的元素可能不同一样。
对此或类似的解决方法有什么想法吗?也许是我还没有想到的更实用的方法?
If ABTool
作为一个密封类是你可以放弃的,那么这里有一个解决方案:
- Replace
sealed
with inner abstract
at the ABTool
宣言;
- Mark
BoxA
and BoxB
as 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}"
}
(或者,代替标记AB
作为内在,移动BoxA
and BoxB
超出它的范围ABTool
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)