-
Notifications
You must be signed in to change notification settings - Fork 7
5.4 타입 클래스 패턴
ahaljh edited this page Sep 5, 2016
·
6 revisions
- 기존 타입의 수정 없이 타입 수정의 효과를 낼 수 있다.
- 확장 메서드(extension method)라고 부르기도 한다.
- 기존 클래스에 메소드를 추가한 효과
- 임의 다형성(ad hoc polymorphism)이라고 하기도 한다
- 다형적 동작이 타입 시스템과 연동되어 있지 않기 때문
// src/main/scala/progscala2/implicits/toJSON-type-class.sc
case class Address(street: String, city: String)
case class Person(name: String, address: Address)
trait ToJSON {
def toJSON(level: Int=0): String
val INDENTATION = " "
def indentation(level: Int=0): (String, String) =
(INDENTATION * level, INDENTATION * (level+1))
}
implicit class AddressToJSON(address: Address) extends ToJSON {
def toJSON(level: Int=0): String = {
val (outdent, indent) = indentation(level)
s"""{
|${indent}"street": "${address.street}",
|${indent}"city": "${address.city}"
|$outdent}""".stripMargin
}
}
implicit class PersonToJSON(person: Person) extends ToJSON {
def toJSON(level: Int=0): String = {
val (outdent, indent) = indentation(level)
s"""{
|${indent}"name": "${person.name}",
|${indent}"address": ${person.address.toJSON(level+1)}
|$outdent}""".stripMargin
}
}
val a = Address("1 Scala Lane", "Anytown")
val p = Person("Buck Trends", a)
println(a.toJSON())
println()
println(p.toJSON())
결과
{
"street": "1 Scala Lane",
"city": "Anytown"
}
{
"name": "Buck Trends",
"address": {
"street": "1 Scala Lane",
"city": "Anytown"
}
}