我应该这样处理这个问题吗?
您可以为每个子类生成扩展或实例函数。
val ContentType.Case2.id: String get() = value.id
这样,您就可以成功地调用:
is ContentType.Case2 -> println(content.id)
如何在保留另一个案例的语义的同时减小应用程序的大小?
contracts
去处理它们。
以您的示例为例,您可以生成:
sealed class ContentType {
class Case1(val value: Foo) : ContentType()
class Case2_3(val value: Bar, val caseSuffix: Int) : ContentType()
}
如你所见,课程
Case2
和
Case3
caseSuffix
确定是哪一个。
您现在可以生成以下扩展(每种情况一个扩展):
@OptIn(ExperimentalContracts::class)
fun ContentType.isCase1(): Boolean {
contract {
returns(true) implies (this@isCase1 is ContentType.Case1)
}
return this is ContentType.Case1
}
@OptIn(ExperimentalContracts::class)
fun ContentType.isCase2(): Boolean {
contract {
returns(true) implies (this@isCase2 is ContentType.Case2_3)
}
return this is ContentType.Case2_3 && caseSuffix == 2
}
@OptIn(ExperimentalContracts::class)
fun ContentType.isCase3(): Boolean {
contract {
returns(true) implies (this@isCase3 is ContentType.Case2_3)
}
return this is ContentType.Case2_3 && caseSuffix == 3
}
既然你用的是
合同
when {
content.isCase1() -> println(content.title)
content.isCase2() -> println(content.id)
content.isCase3() -> println(content.id)
}
如您所见,进一步的优化可能是删除属性
大小写后缀