【Kotlin/Android】abstract(抽象クラス)の使い方!メリットと違い
この記事からわかること
- Android Studio/Kotlinのabstract(抽象クラス)とは?
- メリットと使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
abstract(抽象クラス)とは?
Kotlinではabstract
をclass
の前に付与することで抽象クラスとして定義することができます。抽象クラスとはインスタンス化できないクラスで他のクラスによって継承されることを前提としたクラスです。「抽象的」の言葉通りぼんやりとした具体的でないクラスになります。
抽象クラスには抽象メンバー(具体的な実装を持たないメンバー)と具象メンバー(具体的な実装を持つメンバー)の両方を定義することが可能です。
abstractの使い所
- 複数のクラスに共通の実装を一部定義したい場合
→ 一部の共通のメソッドやプロパティを定義して実装を必須にできる - メソッドの引数などに異なるクラスを渡したい場合
→ 抽象クラスを継承したクラスなら渡せるようにできる
interfaceとの違い
同じような役割を持ったinterface
との違いは以下の通りになります。
特徴 | abstract | interface |
---|---|---|
インスタンス化 | できない | できない |
継承の数 | 1つのみ | 複数可能 |
プロパティ | 抽象プロパティ/具象プロパティ | 抽象プロパティのみ |
メソッド | 抽象メソッド/具象メソッド | 抽象メソッド/具象メソッド |
コンストラクタ | 実装可能 | 実装不可 |
使い方
抽象クラスとして定義するにはabstract
を付与して定義します。中には規格として定義しておきたいプロパティやメソッドを抽象/具象を指定して定義できます。
abstract class Human {
// 抽象プロパティ
abstract var name: String
// 具象プロパティ
var age: Int = 0
// 抽象メソッド
abstract fun selfIntroduction()
// 具象メソッド
fun printName() {
print(name)
}
}
抽象プロパティ (abstract var name: String)
name
はabstract
を付与して抽象プロパティとして定義しています。抽象プロパティは実装を持たないのでサブクラスでオーバーライドする必要があります。
具象プロパティ (var age: Int = 0)
age
は具象プロパティとして定義しています。具象プロパティには初期値を指定できサブクラスでオーバーライドしなくても問題ありません。
抽象メソッド (abstract fun selfIntroduction())
selfIntroduction
は抽象メソッドとして定義しています。抽象メソッドは実装を持たないのでサブクラスでオーバーライドして実装する必要があります。
具象メソッド (fun printName())
printName
は具象メソッドとして定義しています。具象メソッドには実装を指定できサブクラスでオーバーライドしなくても問題ありません。
サブクラスに継承させる
サブクラスに継承させるにはサブクラス名: 抽象クラス()
とします。抽象メンバーとして定義していたものはサブクラスを定義した際にオーバーライドして実装する必要があります。サブクラスに継承させることのできる抽象クラスは1つまでです。
class TargetPerson : Human() {
override var name: String = "ame"
override fun selfIntroduction() {
println("Hi! My Age is $age")
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。