Kotlin中密封类之外的引用?

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(以及实际情况中的许多其他)是相似的,所以我尝试编写一个工具,用相同的代码基计算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
      }
    }