Open1

Scalaでtraitを継承する場合の注意点

LamronLamron

Twitterスパムフィルターを作る際、日本語版と英語版で処理内容がほぼ同じになったので共通処理をtraitにまとめましたがその時の注意点です。

  1. mainは流石に省略できない
    例え同じ処理でもdef main(args: Array[String])を省略すると実行できません。
  2. クラスごとに別の値を入れたい変数にはprivateを付けないと継承先で同じ変数を作らなければいけません。
  3. traitを継承してobjectとclassを両方作る場合、療法が継承しなければいけませんが、抽象メソッドの実装も両方に書かなければいけないので、その場合は以下の様にobjectでのみ実装しclass側からはそれを呼び出すようにします。
class JapaneseSpamFilter extends SVMSpamFilter {
  override def convertToWordArray(text: String, source: String): Array[String] = JapaneseSpamFilter.convertToWordArray(text, source)
}

この時クラス名(この場合はJapaneseSpamFilter)を使わずthisを使ってしまうとclass側、つまり自分を呼び出してしまうのでstackoverflowエラーが出てしまいます。