创建一个类型敏感的函数,而不改变父trait或case类



假设我有两个类,PersonBusiness,它们由特征Entity扩展。

trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity

假设我不能改变Entity,PersonBusiness(他们在一个不同的文件,不被改变)我怎么能定义一个函数,说printEntity,打印字段nameid,取决于实体?例如,给定PersonBusiness的实例,我如何做这样的事情:

object Main extends App {
val person1: Person = Person("Aaaa Bbbb")
val business1: Business = Business("0001")

// How can I do something like this?
person1.printEntity // would call a function that executes println(id)
business1.printEntity // would call a function that executes println(name)
}

任何想法都是赞赏的!抱歉没有上下文,我还在学习中!

这是通过所谓的"扩展方法"完成的。在scala 2中,这是使用隐式包装器类实现的:

trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity
implicit class PersonWrapper(val p: Person) extends AnyVal {
def printEntity(): Unit = {
println(p.name)
}
}
implicit class BusinessWrapper(val b: Business) extends AnyVal {
def printEntity(): Unit = {
println(b.id)
}
}
val person1: Person = Person("Aaaa Bbbb")
val business1: Business = Business("0001")
person1.printEntity()
business1.printEntity()
// prints:
//Aaaa Bbbb
//0001

注意,x.printEntity可以不带括号调用,但是,按照惯例,具有Unit结果类型和副作用的方法应该带显式的空括号调用。


UPD:正如@DmytroMitin指出的那样,您应该从AnyVal扩展隐式包装器类。这允许编译器避免在运行时实际分配包装器类实例,从而提高性能。

相关内容

  • 没有找到相关文章

最新更新