※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

10-5. メンバのオーバーライド

2023年9月30日

概要

スーパークラスから継承したメンバ (プロパティ変数、メソッド) をサブクラスが上書き・再定義することができます。これをオーバーライド (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 です。