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

10-6. 抽象クラス (Abstract Classes)

2023年10月2日

概要

Kotlin の抽象クラスは、サブクラスが継承するための共通のインターフェースと部分的な実装を提供するために使用されます。
抽象クラスは、具体的な実装を持たない抽象メンバ (抽象プロパティや抽象メソッド) を含むことができます。
サブクラスは、これらの抽象メンバを実装する必要があります。

すなわち、抽象クラスは、そのクラスをスーパークラスとしたサブクラスを定義する前提で作成されるクラスです。抽象クラス自体はインスタンス化できません。
開発者側にメンバのオーバライドを強制することができることがメリットといえます。

いわゆるポリモーフィズム・多態性のために利用されるといえます。

書式

抽象クラスは、修飾子 abstract を class の前につけます。
抽象クラスで定義する抽象プロパティや実装を持たないメソッド(抽象メソッド) も頭に修飾子 abstract をつけて定義できます。

abstract クラス名(コンストラクタ) {
    abstract val プロパティ名: 型
    abstract fun 関数名()
}

抽象クラスや抽象クラスのメンバ (抽象メンバ) は、サブクラスへの継承・サブクラスでのオーバライドを前提としているので、修飾子 open をつけなくても、継承・オーバライドが可能です。

抽象クラスのメリット

抽象クラスを使用するメリットは、以下の点などが挙げられます。

  • 共通のインターフェースの提供: 抽象クラスは、サブクラスが実装すべき共通のインターフェースを定義することができます。 これによりサブクラスの動作の一貫性を保つことができます。
  • 部分的な実装の提供: 抽象クラスは、抽象メンバだけでなく、具体的な実装を持つメンバも定義することができます。 これによりサブクラスで共通の処理を再利用することができます。
  • インスタンス化の防止: 抽象クラスはインスタンス化できないため、誤って抽象クラスのインスタンスを作成することを防ぐことができます。

抽象クラスの実装

抽象クラスは、それ自体はインスタンス化できません。
それを継承したサブクラスを作成してインスタンス化します。サブクラスでは抽象メンバをすべてオーバライドし、処理や値を実装する必要があります。

例)

前の節までの Person クラスを通常のクラスではなく、抽象クラスとして定義した例です。
継承した Employee クラスで、メソッドをオーバライドして、具体的な処理を記述しています。

abstract class Person (var name : String = "", var age : Int = 0) {
    abstract fun greeting()
}

class Employee (name: String, age : Int, val empid : Int = 0) : Person(name,age) {
    override fun greeting() {
        println("Hello World! 私は ${name} です。年齢は ${age} 才です。社員番号は ${empid} です。")
    }
}

fun main(){
    val myEmployeeObj : Employee = Employee("HogeHoge", 22, 20230001)
    myEmployeeObj.greeting()
}

出力)

Hello World! 私は HogeHoge です。年齢は 22 才です。社員番号は 20230001 です。