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(内部)として宣言することはできません。
データクラスを「拡張」するテクニック
データクラス自体を直接継承することはできませんが、同等の機能を実現する方法があります。それがスーパークラス(抽象クラス)を宣言し、そのプロパティをサブクラス側でオーバーライドするというアプローチです。
実装例
次の例では、StudentとBookという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として宣言できないため、直接の継承は行えません。共通の構造を持たせたい場合は、今回のように抽象クラスをスーパークラスとして定義し、データクラス側でプロパティをオーバーライドすることで、柔軟かつ安全に拡張性を持たせることができます。
-
C#のConsoleクラスとは?主要プロパティの使い方を実例付きで解説
C#のConsoleクラスは、コンソールアプリケーションにおける標準入力・標準出力・標準エラー出力の各ストリームを表すクラスです。テキストの表示や入力の読み取りだけでなく、文字色や背景色の変更、カーソル位置やサイズの制御など、コンソール操作に関するさまざまな機能が提供されています。ここでは、Consoleクラスの代表的なプロパティの使い方を、サンプルコードと実行結果とあわせて解説します。Console.CursorLeftプロパティコンソール上のカーソル位置(左端から数えた列位置)を変更するには、Console.CursorLeftプロパティを使用します。サンプルコードusing System
-
Javaの列挙型(enum)は任意のクラスを拡張できる?継承の仕組みを解説
Javaの列挙型(enum)とは列挙型(enum)は、Javaにおいて定数の集合を格納するためのデータ型です。1週間の曜日や1年の月名など、固定された値のグループを扱う際に活用されます。列挙型を定義するには、enumキーワードの後に列挙型の名前を続けて記述します。enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }配列と同様に、列挙型内の要素(定数)には0から始まる番号が自動的に割り当てられます。上記の例では、各曜日が以下の図のように番号で識別されます。列挙型はクラスとよく似た構造を持ち