在 Kotlin 密封类之外引用?

2023-12-13

我正在尝试创建一个类,它使用自己的状态来操作它所引用的外部对象的状态。外部对象可以是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作为一个密封类是你可以放弃的,那么这里有一个解决方案:

  1. Replace sealed with inner abstract at the ABTool宣言;
  2. 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(使用前将#替换为@)

在 Kotlin 密封类之外引用? 的相关文章

  • kotlin 从数组中获取随机字符串

    刚接触 kotlin 有不少问题和解答 大部分是 Java 方面的 在遵循文档并针对大量 SO 进行验证之后问题和答案 https stackoverflow com questions 6726963 random string from
  • 无法引用/修改内部类中的非最终变量

    所以我收到错误 不能引用以不同方法定义的内部类中的非最终变量角色 我希望能够将字符串角色类型设置为在该下拉列表中选择的任何内容 如果不是按照我下面尝试的方式 或者我只是在我尝试的代码中犯了一些愚蠢的错误 我该如何做到这一点 谢谢 猎食 im
  • SharedFlow 和 StateFlow 的主要区别

    两者有什么区别共享流 and 状态流 以及如何使用这些MVI建筑学 使用简单更好吗Flow或者这些作为状态和事件 Flow 是冷的 意味着它仅在收集数据时才发出数据 另外Flow不能保存数据 可以把它看成是水在里面流动的管道 Flow中的数
  • 使用 Parceler 与 Kotlin 数据类和构造函数进行序列化

    有没有办法使用Parceler https github com johncarl81 parceler使用 Kotlin 数据类和构造函数进行序列化 无需使用 ParcelProperty每个字段的注释 如果我尝试使用这样的库 Parce
  • Java单例内部类

    我知道Java中单例的概念 我在 Java 中创建单例作为内部类时遇到问题 问题发生在持有者身上 public class NormalClass private class Singleton private static Singlet
  • 带有“final”修饰符的“val”属性的用途是什么?

    最近IntelliJ建议添加final到一个val特性 这个特殊的属性是在init 堵塞 我试图找出什么是语义final val构造以及何时应该使用它 但 Kotlin 的核心在于不变性以及如何使用它val相当于final在 Java 中
  • 如何强制客户端代码使用合约初始化 Kotlin 中所有必需的构建器字段?

    在 2019 年 JetBrains 开放日上 据说 Kotlin 团队研究了合约并试图实现context允许仅在某些上下文中调用函数的合约 例如函数build仅当以下情况时才允许被调用setName方法在它之前被调用过一次 Here ht
  • 如何在 Kotlin 中强制执行空的非空字符串?

    我经常想保存一个不能为空的字符串or blank 空白不够好 编译器处理String 很好地防止 null 我们可以使用aNullableString isNullOrBlank 检查它是否为空或空白 但是 这要求在使用空白支票的所有地方都
  • 您如何在 Android 上处理超高 MP 相机(和图像)? - “画布:尝试绘制太大的位图”

    我有一个活动 用户可以像这样打开相机 getPictureUri createImageFromFile true let photoUri it openCameraActivity REQUEST IMAGE CAPTURE it ph
  • 为什么赋值不是语句

    我有以下代码 class Presenter private var view View null fun attachView view View this view view error Assignment is not a stat
  • Java 反射:如何检索匿名内部类?

    我在另一个类中有一个匿名内部类 SomeClass Both SomeClass class getClasses and SomeClass class getDeclaredClasses 返回空数组 我在中找不到一些关于此的提示Cla
  • 如何在 Kotlin 中将字节大小转换为人类可读的格式?

    在 StackOverflow 中找不到类似的主题 问题类似于如何在java中将字节大小转换为人类可读的格式 https stackoverflow com questions 3758606 如何在Java中将字节大小转换为人类可读的格式
  • 找不到具有不同构建变量的包名称“....”的匹配客户端

    我想实现推送通知 我添加到项目级别 dependencies classpath com android tools build gradle 2 2 2 classpath com google gms google services 3
  • 将 Kotlin .kt 类打包到 JAR 中

    我如何构建HelloWorld kt as a JAR以便它运行 thufir dur kotlin thufir dur kotlin kotlinc HelloWorld kt include runtime d HelloWorld
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样
  • 为什么列出项目图像不显示在 jetpack compose 项目中?

    我正在尝试学习jetpack compose 并且我有带有名称和图像的列表项 我的项目正在运行并且列表名称没有问题 但用户图像没有显示在模拟器中 我不知道我错过了什么 有什么解决办法吗 Model data class Data var n
  • java.lang.AssertionError:CALL 'public final fun

    我正在尝试使用 jetPack Compose 制作一个项目 我拥有它工作所需的所有必要依赖项 但是当我运行我的应用程序时 它会抛出一个错误 我找不到解决方案 这是错误 java lang AssertionError CALL publi
  • 如何在 Kotlin 中将 List 转换为 Map?

    例如 我有一个字符串列表 例如 val list listOf a b c d 我想将其转换为地图 其中字符串是键 我知道我应该使用 toMap 函数 但我不知道如何实现 也没有看到任何例子 你有两个选择 第一个也是性能最高的是使用asso
  • 如何在 Android 应用程序中每天重复一个操作?

    我每天都想重复一个动作 即使应用程序未运行或设备已重新启动 重新启动 它也必须继续工作 在我的代码中 我尝试每 1 分钟显示一条 TOAST 消息 作为测试 它在模拟器中工作正常 但在真实设备上不起作用 我尝试对修复进行一些更改 正如我在一
  • 如何在 Android 中动态添加新的 Android 芯片?

    我有一个名为 Question 的类 其中包含标签的字符串数组 我试图使用 Kotlin 显示 Recyclerview 中的每个问题以及新芯片中的每个标签 这些芯片将包含在一个 ChipGroup 中 我的问题是 如何将数组的每个标签元素

随机推荐

  • 如何降级 Angular CLI 版本

    我已经更新了我的 Angular cli 版本 现在它显示 Angular 5 2 0 我在 Angular 4 中构建了整个代码 您能帮我完成降级我的 Angular cli 版本 特定版本 的步骤 以便我拥有 Angular4 这是我当
  • 每次使用 Rsync 保存时上传文件

    我使用 Eclipse PDT Ubuntu 10 10 进行 Web 开发 并使用 Rsync 手动成功上传更改的文件 rsync e ssh av home goksel Sites test email protected test
  • 如何从表中删除行

    这个问题是这个问题的后续问题 在 SAPUI5 表中添加新行的按钮 在我的新场景中 我在表格的第一列中添加了一个 删除 按钮 同样 JSON 文件如下所示 Invoices ProductName Pineapple Quantity 21
  • Rails、Chartkick:在图表上显示值

    The 图表踢gem 可以让您创建多种图表 目前 我的图表如下所示 饼图 institutions 柱形图 stats 我希望这些值显示在图表上 在饼图中 我希望数字 244 和 43 在饼图内部或外部可见 在柱形图中 我希望将值放在顶部或
  • 如何在 python xml.etree.ElementTree 中删除迭代器内的节点

    如何删除当前节点 同时迭代从根开始的所有节点getiterator 功能 import xml etree ElementTree as ET tree ET parse file xml root tree getroot for nod
  • 使用 Spring security JPA 进行多租户

    这是这个的后续Spring JPA 的多租户 我选择使用 AbstractRoutingDataSource 但现在的问题是数据源和实体管理器 bean 在启动时初始化 无论如何 有没有在春天配置这个 它会在用户通过身份验证后初始化 我能想
  • iphone:如何在 UITableView 中创建多列[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 UITableView 中显示多列 我有多行和多列数据 但 iPhone UITableView 仅包含单列和多行 如何按照 Apple 的人机界面指南显示多列数据 有任何想法吗 使用 Gri
  • Android sendTextMessage 在执行时发送两条相同的消息

    我一直在开发一个发送短信的应用程序 我遇到的问题是 sendTextMessage 方法发送两条内容相同的消息 我该如何解决这个问题 这个类开始了这个过程 public class C2DMMessageReceiver extends B
  • Ada 中有“this”关键字吗?

    具体来说 任务有没有办法获得对其自身的引用 例如 task type someTask type someTaskAccessor is access someTask task body someTask is pointerToTask
  • 缺少 .bpl 文件

    编译 FireMonkey 项目并在另一台 PC 上执行该应用程序后 我遇到了错误 rtl190 bpl 丢失 所以我搜索了谷歌 找到了对我不起作用的 解决方案 它说我应该取消选中 与动态 RTL 链接 和 与 Delphi 运行时链接 事
  • 如果我们在 itext 中使用 ttf 文件,是否需要拥有字体许可证? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 据我所知 itext 不附带任何字体库 您需要提供字体库 pdf一旦生成 将由Acrobat查看 并假设它是标准字体 adobe将支持它 我的问题是关于字体的许可 a 我需要获得在
  • 如何使内联块元素填充行的其余部分?

    使用CSS和两个内联块 或其他 DIV标签而不是使用表格可以实现这样的事情吗 表格版本是这样的 添加了边框以便您可以看到它 table style width 100 tr td style border 1px solid black w
  • 使用 sftp 和 Maven 上传目录

    如何在 Maven 中使用 sftp 和公钥身份验证上传目录 Eclipse 更新站点 有关背景信息 我正在使用 tycho 构建 Eclipse 插件并想要获取更新站点
  • 检查 Google 表格单元格是否受到 Google Apps 脚本的保护 [重复]

    这个问题在这里已经有答案了 如何检查 Google 表格中的单元格是否受到 Google Apps 脚本的保护 具体来说 是范围保护 而不是表保护 检查单元格是否具有坐标row and col 从1开始 有保护用途 function has
  • 随机生成独特的颜色?

    我正在使用一个可以绘制颜色线的绘图包 255 255 255 所以基本上我正在做的是 Random Next 0 255 Random Next 0 255 Random Next 0 255 每次添加一行时生成一种颜色 这一切都很好 但有
  • WPF:如何在 Xaml 中使用枚举填充组合框

    我知道有多种方法可以做到这一点 但如果可能的话 我想让它变得更容易 因为我有很多组合框可以通过这种方式绑定 有一个使用 ObjectDataProvider 的建议here 问题是我必须为每个枚举创建一个资源条目 而且数量很多 到目前为止
  • 数组到字符串的转换并且只有变量应该通过引用传递

    我对 php 没有经验 我是新人 我正在尝试使用这段代码http mach13 com how to get a variable name as a string in php查找变量的名称 但我不断收到 该行的数组到字符串转换 aDif
  • 如何使用 jQuery 实现 的 onchange?

  • JSF 从 HTTPS 重定向到 HTTP

    我的应用程序位于测试服务器上 仅通过 https 执行 当我在不重定向的情况下导航时 它工作得很好 Example
  • 在 Kotlin 密封类之外引用?

    我正在尝试创建一个类 它使用自己的状态来操作它所引用的外部对象的状态 外部对象可以是A类或B类 它们类似 但不受作者控制 因此 创建了一个密封类来访问它们的公共属性 每个 SimY4 的早期回答 DOES NOT COMPILE class