代码之家  ›  专栏  ›  技术社区  ›  TableTopRug

如何从Kotlin中的密封类继承?

  •  1
  • TableTopRug  · 技术社区  · 7 月前

    这个问题是基于 How to extend enums in Kotlin? .

    我试图实现这篇文章中的一个答案,但它并没有像我预期的那样工作。我希望这个类的每个实现都有一组特定于每个实现的枚举(图标图像的位置)。它们都有几个函数的相同实现,只是字符串和图标不同。

    abstract class Platform(val name: String) {
        abstract var icon: Icon
    
        abstract sealed class Icon {
            abstract val png: String
        }
    }
    
    class Twitch : Platform("Twitch") {
        override var icon: Icon = Icon.PURPLE
    
        sealed class Icon {
            data class PURPLE(val png: String = "drawable.twitch/glitch/01. Twitch Purple/glitch_flat_purple.png") : Icon()
        }
    }
    

    这个实现目前给了我一个错误: Var-property type is models.Twitch.Icon, which is not a type of overridden public abstract var icon: models.Platform.Icon defined in models.Platform

    真的有办法做到这一点吗?

    1 回复  |  直到 7 月前
        1
  •  1
  •   tyg    7 月前

    你试着把一个 Twitch.Icon 实例转化为a Platform.Icon 变量,两种不同且不相关的类型。这行不通。

    据我所知,你想要什么 PURPLE 成为密封等级制度的一部分 平台。偶像 。在这种情况下,您可以简单地删除 sealed class Icon 在里面 Twitch ,这是不需要的。

    还有其他一些小错误,比如丢失 override 修改器 png 当您尝试实例化时,属性和缺少的参数 紫色 。但是,当所有问题都解决后,最终结果如下:

    class Twitch : Platform("Twitch") {
        override var icon: Icon = PURPLE()
    
        data class PURPLE(override val png: String = "drawable.twitch/glitch/01. Twitch Purple/glitch_flat_purple.png") : Icon()
    }