Android
 Computer >> コンピューター >  >> プログラミング >> Android

Kotlinでデータクラスを拡張する方法:抽象クラスによるプロパティのオーバーライド

Kotlinのデータクラス(data class)は、アプリケーションのデータを保持するための特別なクラスです。JavaにおけるPOJO(Plain Old Java Object)クラスと同じ役割を果たします。

Javaでは、クラスのプロパティにアクセスするためにgetterおよびsetterメソッドを手動で作成する必要があります。一方Kotlinでは、クラスをdataキーワード付きで宣言するだけで、コンパイラが自動的に必要なサポートメソッドを生成してくれます。具体的には、コンストラクタパラメータに対するgetter・setter、さらにhashCode()、equals()、toString()、copy()が自動的に作成されます。

データクラスとして成立するための条件

Kotlinでクラスをデータクラスとして扱うには、以下の条件をすべて満たす必要があります。

  • プライマリコンストラクタには、少なくとも1つのパラメータが必要です。
  • プライマリコンストラクタのすべてのパラメータは、valまたはvarとして宣言しなければなりません。
  • データクラスは、abstract(抽象)、open(継承可能)、sealed(封印)、inner(内部)として宣言することはできません。

データクラスを「拡張」するテクニック

データクラス自体を直接継承することはできませんが、同等の機能を実現する方法があります。それがスーパークラス(抽象クラス)を宣言し、そのプロパティをサブクラス側でオーバーライドするというアプローチです。

実装例

次の例では、StudentBookという2つのデータクラスを作成し、あわせて抽象クラスResourceを定義しています。Bookクラスの中では、Resourceクラスのプロパティをオーバーライドしています。

data class Student(val name: String, val age: Int)

fun main(args: Array<String>) {
    val stu = Student("Student1", 29)
    val stu2 = Student("Student2", 30)
    println("Student1 Name is: ${stu.name}")
    println("Student1 Age is: ${stu.age}")
    println("Student2 Name is: ${stu2.name}")
    println("Student2 Age is: ${stu2.age}")
    val b = Book(1L, "India", "123222") // 抽象クラスの実装
    println(b.location)
}

// スーパークラスの宣言
abstract class Resource {
    abstract var id: Long
    abstract var location: String
}

// Resourceクラスのプロパティをオーバーライドしたデータクラス
data class Book (
   override var id: Long = 0,
   override var location: String = "",
   var isbn: String
) : Resource()

出力結果

上記のコードを実行すると、以下のような出力が得られます。

Student1 Name is: Student1
Student1 Age is: 29
Student2 Name is: Student2
Student2 Age is: 30
India

まとめ

Kotlinのデータクラスは、ボイラープレートコードを大幅に削減できる強力な機能です。ただし、データクラスはabstract、open、sealed、innerとして宣言できないため、直接の継承は行えません。共通の構造を持たせたい場合は、今回のように抽象クラスをスーパークラスとして定義し、データクラス側でプロパティをオーバーライドすることで、柔軟かつ安全に拡張性を持たせることができます。

  1. C#のConsoleクラスとは?主要プロパティの使い方を実例付きで解説

    C#のConsoleクラスは、コンソールアプリケーションにおける標準入力・標準出力・標準エラー出力の各ストリームを表すクラスです。テキストの表示や入力の読み取りだけでなく、文字色や背景色の変更、カーソル位置やサイズの制御など、コンソール操作に関するさまざまな機能が提供されています。ここでは、Consoleクラスの代表的なプロパティの使い方を、サンプルコードと実行結果とあわせて解説します。Console.CursorLeftプロパティコンソール上のカーソル位置(左端から数えた列位置)を変更するには、Console.CursorLeftプロパティを使用します。サンプルコードusing System

  2. Javaの列挙型(enum)は任意のクラスを拡張できる?継承の仕組みを解説

    Javaの列挙型(enum)とは列挙型(enum)は、Javaにおいて定数の集合を格納するためのデータ型です。1週間の曜日や1年の月名など、固定された値のグループを扱う際に活用されます。列挙型を定義するには、enumキーワードの後に列挙型の名前を続けて記述します。enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }配列と同様に、列挙型内の要素(定数)には0から始まる番号が自動的に割り当てられます。上記の例では、各曜日が以下の図のように番号で識別されます。列挙型はクラスとよく似た構造を持ち