finalとsealed
Classの継承やメンバーのオーバーライドを制限する機能として「final」と「sealed」が使えます。
- 「final」はクラスやメンバーに対して設定できる修飾詞です。
- finalが設定されたクラスは継承できません。
- finalが設定されたメンバーはオーバーライドできません。
- 「sealed」はクラスに設定できる修飾詞です。
- sealedとされたクラスは、同一ファイル内のクラスからは継承できますが、別ファイル内で定義されたクラスでは継承できません。
- ただし、sealedクラスを継承したクラスは、別ファイルのクラスからも継承できます。
// finalクラス // このクラスは継承できない。 final class Foo // これはエラー //class ExtendsFoo extends Foo class Var { // final メンバー // これらはオーバーライド不可 final def a = "a" final val b = "b" } class ExtendVar extends Var { //override def a = "aa" // これはエラー //override val b = "bb" // これはエラー } // sealedクラス sealed class Hoge { def a = "a" } // sealedクラスの派生クラス。同一ファイル内なのでOK class ExtendsHoge extends Hoge { def b = "b" }
↑とは別のファイル。
// 別ファイルのクラスでは継承できない。 // ↓はエラー // class ExtendsHogeInOtherFile extends Hoge // sealedクラスの派生クラスは別ファイルからも利用できる。 class ExtendsExtendsHogeInOtherFile extends ExtendsHoge object FinalClassSample2 { def main(args: Array[String]) { // sealedクラスのメソッド呼び出しもOK var a = new ExtendsExtendsHogeInOtherFile println( a.a ) println( a.b ) } }
FinalClassSample2の実行結果です。
a b