ここでは、クラスの継承についてまとめます。
関連
クラスについては、「オブジェクトとクラス」にまとめています。
クラスの継承
クラスは、別のクラスを継承(inheritance)することで、既存クラスの機能を拡張できます。
例えば、人物を表す Person クラスを継承して、Student クラスを作るとします。
|
1 2 3 4 5 6 7 8 |
open class Person(val name: String, val age: Int) { fun showMyself() { println("I am $name and $age years old.") } } class Student(name: String, age: Int, val id: Int): Person(name, age) |
Kotlin でクラスを継承するには、自身のクラスの直後に「:」記号を付けて、継承したいクラス名とコンストラクタを記述します。
この時、継承元クラス(Person)のことをスーパークラス(superclass)と呼びます。
継承先クラス(Student)のことをサブクラス(subclass)と呼びます。
Kotlin は、デフォルトではクラスを継承することができません。
クラスを継承させるには、open 修飾子を付ける必要があります。
例の Student クラスは、以下のように使います。
|
1 2 3 4 5 |
fun main() { val taro = Student("太郎", 35, 1) taro.showMyself() } |
継承することで、スーパークラスのメンバをサブクラスでも使えるようになります。
例では、スーパークラスの name や age、そして showMyself() を
サブクラスでも使用できていることが分かります。
クラスメンバのオーバライド
スーパークラスから受け継いだメンバを、サブクラスが上書きすることが可能です。
これをオーバライド(override)と言います。
クラスの継承と同じように、オーバライドもデフォルトでは禁止されています。
そのため、メンバには修飾子 open を付けます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
open class Person(val name: String, val age: Int) { open fun showMyself() { println("I am $name and $age years old.") } } class Student(name: String, age: Int, val id: Int): Person(name, age) { override fun showMyself() { println("My id is $id.") } } |
クラス Person のメソッド showMyself() に修飾子 open を付け、オーバライド可能にしました。
オーバライドする際には、修飾子 override を付けて上書きします。
サブクラス Student は、以下のように使います。
|
1 2 3 4 5 |
fun main() { val taro = Student("太郎", 35, 1) taro.showMyself() // My id is 1. } |
オーバライドした後、スーパクラスの実装をそのまま使いたい場合は、以下のようにします。
|
1 2 3 4 5 6 7 |
class Student(name: String, age: Int, val id: Int): Person(name, age) { override fun showMyself() { super.showMyself() println("My id is $id.") } } |
プロパティもオーバライドすることができます。
クラスやメンバと同様に、open や override の修飾子を付けるだけです。