Scala sealed trait定义的def如何在子类实现为val属性
Scala 特质抽象成员实现方案(无冗余字段)
直接将需要实现的branch作为case class的主构造参数,用override val标记即可同时满足两个要求:一是实现Bank特质的抽象def,二是作为类的公开属性支持直接通过实例调用,全程不会产生冗余字段。
代码实现
sealed trait Bank { def branch: Option[BranchName] } case object Bank { case class SomeBank( details: BankDetails, override val branch: Option[BranchName] ) extends Bank }
方案优势
- 零冗余字段:
branch既是构造入参,也是特质要求实现的成员,类内部只会生成这一个同名字段,完全解决之前方案里setBranch和branch重复存储的问题 - 调用方式完全符合要求:实例化后直接通过
someBank.branch就能访问属性,依赖该字段的外部服务不需要做任何适配 - 适配case class原生逻辑:
branch会自动被纳入case class自动生成的equals、hashCode、copy、toString方法逻辑,不会出现对象比较、拷贝时漏算字段的bug - 语义合法:Scala 原生支持用
val重写无参数的抽象def,访问逻辑完全匹配,不违反里氏替换原则
特殊场景适配
如果branch的值不需要外部传入,可以直接通过details字段推导,那连构造参数都不需要加,直接在类内部给branch赋值即可:
case class SomeBank(details: BankDetails) extends Bank { // 示例:从details中提取关联的分支信息 override val branch: Option[BranchName] = details.getRelatedBranch }
编码建议:实现抽象成员时建议显式加上
override关键字,虽然Scala对抽象成员的重写不强制要求该关键字,但显式标注能提升代码可读性,也能避免后续特质新增同名默认实现时出现意外的覆盖冲突。
内容的提问来源于stack exchange,提问作者CodeSsscala
相关产品推荐
相关产品推荐

