10-5. メンバのオーバーライド
概要
スーパークラスから継承したメンバ (プロパティ変数、メソッド) をサブクラスが上書き・再定義することができます。これをオーバーライド (override) と呼びます。
オブジェクト指向のプログラミングでは、基底クラスの既存の関数やプロパティをオーバーライドして利用することが非常に多く、Android のアプリを作る上でも重要な概念となります。
オーバーライド可能なメンバ、オーバーライドの方法
クラスの継承と同様に Kotlin ではメンバのオーバライドもできないようになっているので、オーバーライド可能なメンバには、修飾子 open を付けます。
サブクラス側では、オーバーライドする際に 修飾子 override をつける必要があります。
また、サブクラス側でオーバーライドした上で さらにスーパークラスのメンバを使いたい場合は、super.メンバ と記載します。
メソッドだけでなく、プロパティのオーバーライドも可能です。
オーバーライドのルール
オーバーライドについては以下のルールがあります。
- オーバーライドするメンバは、親クラスのメンバと同じシグネチャ (名前、パラメータの型と数、戻り値の型) を持つ必要があります。
- オーバーライドするメンバの可視性は、親クラスのメンバと同じか、 より緩くすることができます。
例えば、 親クラスのメンバが protected であれば、サブクラスでは protected または public でオーバーライドできます。 - final 修飾子が付いたメンバはオーバーライドできません。
オーバーライドの例
前の節の Person, Employee クラスを利用します。
メソッド greeting() をオーバーライドして再定義しています。
まず親クラスの greeting() を super.greeting() で実行した後で、サブクラス側で追加したプロパティの empid も出力するようにした形です。
open class Person (var name : String = "", var age : Int = 0) { open fun greeting() { println("Hello World! 私は ${name} です。年齢は ${age} 才です。") } } class Employee (name: String, age : Int, val empid : Int = 0) : Person(name,age) { override fun greeting() { super.greeting() println("社員番号は ${empid} です。") } } fun main(){ val myEmployeeObj : Employee = Employee("HogeHoge", 22, 20230001) myEmployeeObj.greeting() }
出力
Hello World! 私は HogeHoge です。年齢は 22 才です。
社員番号は 20230001 です。