Scalaの継承の研究
研究という程でもないんだけど、ScalaやJavaの列挙型は気持ち悪いなあと思い、ちょっと考えて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