Scalaの継承の研究

研究という程でもないんだけど、ScalaJavaの列挙型は気持ち悪いなあと思い、ちょっと考えてcase objectがいいと思い至った。調べてみると同じような事をされている先達がいるものです。


http://xerial.org/scala-cookbook/recipes/2012/06/29/enumeration/


今回は引数に与えるフラグ(CASE_SENSITIVE | CASE_INSENSITIVE)なので、じゃあCASE_STYLEという親を作ってそこから継承してみようと考えつく。が、case object CASE_STYLEをextendsしようとしても出来ない。これはJavaのコードをJADなどで逆コンパイルしてみると一目瞭然で、finalキーワード付きclass で宣言されているからなのです。こういうときのためにJavaコードを読めるようになっておくといろいろ捗ります。


case object、 object、 case class、 classで継承のいろいろなパターンを試してみました。


・親がcase object、objectの場合は常に継承出来ない。


・親がcase class A()の場合は

    • > case objectに継承できない
    • > objectに継承できる。例:object A1 extends A()
    • > case classに継承できない。
    • > classに継承できる。例:class A2 extends A()


・親がclass B()の場合は

    • > case objectに継承できる。例:case object B1 extends B
    • > objectに継承できる。例:object B2 extends B
    • > case classに継承できる。例:case class B3() extends B
    • > classに継承できる。例:class B4 extends B


そして、case->caseの継承はできない。


僕のやりたいことは継承されたcase objectを作りたいので、以下のようにすれば良い。

class CASE_STYLE
case object CASE_SENSITIVE extends CASE_STYLE
case object CASE_INSENSITIVE extends CASE_STYLE