kotlin - 如何覆盖密封类字段?
问题描述
我在我的服务中创建了一个自定义结果字段(而不是 Kotlin 的结果),因此我可以在成功和失败案例中返回一个消息字段:
sealed class Result<T> {
data class Success<T>(val value: T, val message: String) : Result<T>()
data class Failure<T>(val throwable: Throwable? = null, val message: String) : Result<T>() {
val isExceptional = throwable != null
val error: Throwable
get() = throwable ?: error("Error is undefined in [$this]")
}
}
然后在另一个类中,我调用了一个产生此结果的方法并希望记录 Result.message
logger.info { "Finished with message [${result.message}]." }
只是,kotlin 编译器无法识别“消息”,因为它不是 Result 的直接属性,而是 Success 和 Failure 的属性。
我试图覆盖消息字段并在 Result 类中定义它。但我得到一个错误。
Error:(10, 38) Kotlin: 'message' in 'Result' is final and cannot be overridden
那么,如何在不将结果实例强制转换为它的派生实现类(成功或失败)的情况下访问 Result.message 呢?
解决方案
我找到的一个干净的解决方案如下。
而 Kotlin 不允许我们覆盖密封的类成员。它确实允许我们覆盖接口成员。
因此,我为消息字段创建了一个简单的接口,并从 Result 类中实现了它:
interface ResultMessage {
val message: String
}
sealed class Result<T> : ResultMessage
// Now I'm able to override the message field simply, with no error
data class Success<T>(val value: T, override val message: String) : Result<T>()
data class Failure<T>(val throwable: Throwable? = null, override val message: String) : Result<T>() {
val isExceptional = throwable != null
val error: Throwable
get() = throwable ?: error("Error is undefined in [$this]")
}
推荐阅读
- php - Jquery 代码使所有以前的 PHP 语法高亮错误 [Sublime Text 3]
- uikeyboard - 如何从电话型键盘的附件按钮获取操作?
- r - 在数据点上绘制具有置信区间的样条曲线
- c# - 使用 c# 的 CNTK 基本操作以下 python 示例给出错误
- java - Java中套接字的一些问题
- eclipse - 显示 Web 服务和客户端之间的流量
- c++ - 从Linux到Windows交叉编译enet,链接错误
- elasticsearch - 如何在 Elasticsearch 中查找带逗号的数字?
- php - 从 FuelPHP 迁移到 Laravel:一个响应的问题
- c# - 同时使用来自同一数据库列的多个数据集填充组合框