Rubyなどにある既存のクラスにメソッドなどを追加するオープンクラスという手法。
ScalaではRubyの様なオープンクラスは無いものの、暗黙の型変換を使って
オープンクラスっぽいことが出来るようです。
scala.xml.Nodeにテキストと属性値を表示するメソッドを追加してみる例です。
OpenClass.scala
import scala.xml._
import java.io.File
object OpenClass {
class NodeWrapper(node:scala.xml.Node) {
def getText = Utility.trim(node).text
def getAttribute(key:String) = node \ ("@"+key) text
}
implicit def node2nodeWrapper(node: scala.xml.Node) = new NodeWrapper(node)
def main(args: Array[String]): Unit = {
val xml = XML.loadFile(new File("test.xml"))
println(xml.getText)
println(xml.getAttribute("src"))
}
}
まず、メソッドを追加する為のラッパークラスを用意します。
そこでオープンしたいクラスのインスタンスを保持し、追加したいメソッドを書きます。
次に、implicitキーワードを用い暗黙の型変換が行われるようにします。
メソッドの名前はおそらく何でもいいので、引数に元のクラスのインスタンスを設定し
返り値がラッパークラスのインスタンスになるようにします。
このようにすることで、追加したメソッドを元のクラスで利用しようとすると
暗黙的にラッパークラスへ変換されメソッドが実行されます。
見ての通り実際にはラッパークラスが仕事をしているのですが、コードを見る限りでは
元のクラスにメソッドが追加されたかのように見えるというわけです。