Open1
Scalaでtraitを継承する場合の注意点
Twitterスパムフィルターを作る際、日本語版と英語版で処理内容がほぼ同じになったので共通処理をtraitにまとめましたがその時の注意点です。
- mainは流石に省略できない
例え同じ処理でもdef main(args: Array[String])
を省略すると実行できません。 - クラスごとに別の値を入れたい変数には
private
を付けないと継承先で同じ変数を作らなければいけません。 - 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エラーが出てしまいます。