Kotlin密封类层级问题:MVI模式下UseCaseResult移文件报错解决
解决MVI模式下UseCaseResult移至独立文件的构造访问权限问题
这个问题我之前做MVI开发时也碰到过,核心原因是Kotlin sealed类的主构造函数默认是private的——当你把UseCaseResult和AttendLeaveEventResult放在同一个文件时,同一个文件内的类可以访问这个private构造;但移到独立文件后,跨文件的子类就无法调用父类的private构造了,所以才会抛出Cannot access <init>: it is private in UseCaseResult的错误。
解决步骤很简单:
只需要把UseCaseResult的主构造函数可见性改成protected,这样子类(即使在不同文件)就能合法调用父类构造了。
修改后的独立文件UseCaseResult.kt代码:
sealed class UseCaseResult<R> protected constructor() { open class SomeFetching<R> : UseCaseResult<R>() data class Success<R>(val result: R) : UseCaseResult<R>() data class Failure<R>(val error: Throwable) : UseCaseResult<R>() }
你的AttendLeaveEventResult代码可以保持不变:
sealed class AttendLeaveEventResult : UseCaseResult<AttendLeaveEventResult>()
补充说明:
protected修饰符保证只有UseCaseResult的子类(包括跨文件的同包子类)能访问构造函数,既解决了权限问题,又保留了sealed类限制继承范围的特性。- 如果你的项目使用Kotlin 1.1及以上版本,sealed类的子类允许放在同一个包的不同文件中,这个修改完全符合语法规范。
内容的提问来源于stack exchange,提问作者Rakesh Patel
相关产品推荐
相关产品推荐

