Kotlin中密封类之外的引用?
我试图创建一个类,它使用自己的状态来操作它持有引用的外部对象的状态。外部对象可以是类A或类B,它们类似,但不受作者控制。因此,根据创建了一个密封类来访问它们的公共属性 现在的问题是我发现我不能以我想要的方式对外部对象进行操作,因为一个密封的类不能引用它的外部类成员。即使使用不同的方法(密封类除外),是否有更好的方法来实现这一点,同时:Kotlin中密封类之外的引用?,kotlin,abstract-class,inner-classes,sealed,data-class,Kotlin,Abstract Class,Inner Classes,Sealed,Data Class,我试图创建一个类,它使用自己的状态来操作它持有引用的外部对象的状态。外部对象可以是类A或类B,它们类似,但不受作者控制。因此,根据创建了一个密封类来访问它们的公共属性 现在的问题是我发现我不能以我想要的方式对外部对象进行操作,因为一个密封的类不能引用它的外部类成员。即使使用不同的方法(密封类除外),是否有更好的方法来实现这一点,同时: 不改变外国A类或B类 考虑到A和B(以及实际情况中的许多其他)是相似的,所以我尝试编写一个工具,用相同的代码基计算A和B并为其添加魔力;及 注意,尽管ABToo
- 不改变外国A类或B类李>
- 考虑到A和B(以及实际情况中的许多其他)是相似的,所以我尝试编写一个工具,用相同的代码基计算A和B并为其添加魔力;及
- 注意,尽管ABTool工具是相同的,但它们用于添加魔术的方式在A和B中略有不同,正如访问A和B的概念上通用元素的方法可能不同
对此或类似的解决方法有何想法?也许我还没有想到一种更实用的方法?如果
ABTool
作为一个密封的类是你可以放弃的,那么这里有一个解决方案:
ABTool
声明中将密封的替换为内部摘要
李>
将BoxA
和BoxB
标记为内部
李>
(或者,不是将AB
标记为内部,而是将BoxA
和BoxB
移出ABTool
的范围)另一种方法是将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
}
}
并在从ABTool
创建时传递此
。毕竟,internal
就是这么做的
在这种特定情况下,AB
本身中恰好没有使用该字段,因此您可以将其从那里删除,并在BoxA
和BoxB
中将其设置为val
。给定val a=a()
,我尝试了ABTool.AB.BoxA(a)
。我想BoxA
希望我实例化AB
,可能是因为BoxA
是内部的ABTool.AB().BoxA(a)
不起作用,可能是因为AB
是抽象的<代码>ABTool().AB().BoxA(a)
不起作用,可能是因为ABTool需要构造函数?。。。但构建它是我首先要做的。我是不是错过了,这需要在一个同伴类或什么?你能帮我理解如何实例化它吗?谢谢。事实上,这很复杂。在ABTool
的主构造函数中是否需要val obj:AB
?当它存在时,您需要在创建ABTool
之前创建一个AB
(BoxA
或BoxB
),但由于它们是内部的,所以它们需要一个ABTool
实例才能存在。暂时忘记外部数据类,这里有一个更简单的部分我无法理解。。。如果BoxA
和BoxB
的构造函数(因为它们是内部的
)依赖于要查看的AB实例,并且只能通过创建BoxA
或BoxB
来创建AB
类型的对象实例(因为AB
是抽象的,BoxA
和BoxB
是唯一将AB
作为超类的类)…它们可以被实例化吗?(我一直认为我在理解内部类时缺少了一个关键环节…)因为抽象类中的内部类本身可能是一个有用的答案。
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}"
}
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
}
}