2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Scalaでオープンクラスっぽいこと

Last updated at Posted at 2012-11-21

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キーワードを用い暗黙の型変換が行われるようにします。
メソッドの名前はおそらく何でもいいので、引数に元のクラスのインスタンスを設定し
返り値がラッパークラスのインスタンスになるようにします。
このようにすることで、追加したメソッドを元のクラスで利用しようとすると
暗黙的にラッパークラスへ変換されメソッドが実行されます。
見ての通り実際にはラッパークラスが仕事をしているのですが、コードを見る限りでは
元のクラスにメソッドが追加されたかのように見えるというわけです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?