不修改父trait与样例类前提下如何定义类型敏感的实体打印函数
实现思路
你可以通过Scala的扩展方法特性实现需求,无需修改原有类定义,以下是对应不同Scala版本的可行实现:
Scala 3 实现(原生扩展方法)
Scala 3提供了原生的扩展方法语法,直接定义即可:
// 定义扩展方法,放在可被Main导入的作用域内即可 extension (entity: Entity) def printEntity: Unit = entity match case p: Person => println(p.name) case b: Business => println(b.id)
如果希望避免模式匹配的运行时遗漏风险,也可以分别针对两个类定义扩展:
extension (p: Person) def printEntity: Unit = println(p.name) extension (b: Business) def printEntity: Unit = println(b.id)
Scala 2 实现(隐式类语法糖)
Scala 2没有原生扩展方法,通过隐式类实现同等调用效果:
// 定义隐式类,放在可被Main导入的作用域内即可 implicit class EntityExtension(entity: Entity) { def printEntity: Unit = entity match { case p: Person => println(p.name) case b: Business => println(b.id) } }
同样支持分类型单独定义:
implicit class PersonExtension(p: Person) { def printEntity: Unit = println(p.name) } implicit class BusinessExtension(b: Business) { def printEntity: Unit = println(b.id) }
调用效果
以上两种实现都可以直接适配你给出的Main代码,无需修改原有调用逻辑:
object Main extends App { val person1: Person = Person("Aaaa Bbbb") val business1: Business = Business("0001") person1.printEntity // 输出:Aaaa Bbbb business1.printEntity // 输出:0001 }
内容的提问来源于stack exchange,提问作者bruno
相关产品推荐
相关产品推荐

