抽象クラス
クラスのメンバーにキーワード「abstract」をつけて宣言することができます。
これを抽象メンバーと言います。
抽象メンバーは処理や値といった具体的な実装を持ちません(持つことができません)
抽象メンバを持つクラスを抽象クラスと呼び、このクラスにも「abstract」キーワードを付ける必要があります。
抽象クラスはインスタンス化することができません。
その理由は、抽象クラスは抽象メンバという具体的な実装を持たないメンバーが含んでいて、
それ単体では不完全な状態だからです。
fun main(args: Array) {
// Personは抽象クラスなのでインスタンス化できない
// 以下のコードはビルドエラーになる
// val someone = Person("someone")
}
abstract class Person(name: String) {
abstract var name: String
abstract fun describe()
}
抽象メンバーは自動的にオーバーライド可能な「open」になります。
抽象クラスを直接インスタンス化することはできませんが、
抽象クラスを検証した派生クラスで抽象メンバーをオーバーライドして具体的な実装を与えることで
利用することができます。
fun main(args: Array) {
val someone: Person = Student("suzuki")
someone.describe()
}
abstract class Person(name: String) {
abstract var name: String
abstract fun describe()
}
class Student(name: String) : Person(name) {
override var name = name
override fun describe() {
println("name: ${name}")
}
}
name: suzuki
インターフェース
KotlinにはJavaと同じようなインターフェースが存在します。
インターフェースと抽象クラスとの違いは、データを保持できるかどうかです。
fun main(args: Array) {
val someone: Printable = Student("suzuki")
someone.Print()
someone.PrintImpl()
}
interface Printable {
fun Print() // 何もしないと自動的に「open」で「abstract」
fun PrintImpl() {
// インターフェースの関数でも実装することは可能
println("print impl")
}
}
class Student(name: String) : Printable {
val name = name
override fun Print() {
println("name = ${name}")
}
}
name = suzuki
print impl