[備忘] kotlinのインターフェイスと抽象クラス
インプットの記録
interface
クラスに実装を強制する「ルール」的なものおおおおおおお
複数のクラスに共通の動作を提供
typescriptの型定義とほぼ同じ感覚
interface Animal {
fun makeSound() // インターフェイスでは関数の本体を書かない(実装はしない)
}
class Dog : Animal {
override fun makeSound() {
println("ワンワン!")
}
}
class Cat : Animal {
override fun makeSound() {
println("ニャーニャー!")
}
}
fun main() {
val dog = Dog()
val cat = Cat()
dog.makeSound() // ワンワン!
cat.makeSound() // ニャーニャー!
}
抽象クラス(abstract class)
クラスの雛形を作る
具象メソッド、抽象メソッドの両方を持てる
abstract class Animal(val name: String) {
abstract fun makeSound()
fun sleep() {
println("$name は眠っています。")
}
}
class Dog(name: String) : Animal(name) {
override fun makeSound() {
println("ワンワン!")
}
}
fun main() {
val dog = Dog("ポチ")
dog.makeSound() // ワンワン!
dog.sleep() // ポチ は眠っています。
}
それぞれ違い
インターフェイスはクラスの共通動作、つまり「何を」までは定義し、具体的な実装はしない。
抽象クラスは共通動作の実装、つまりプロパティ定義や関数の中身も書ける。
また、抽象クラスはコンストラクタを持たすことができるが、インンターフェイスは持たせられないので、そこも違い。
クラスごとに違う情報を持たせたかったり、インスタンス化時に値を渡したい時は抽象クラスやデータクラス、そうでないときはインターフェイスという見方もある。
超要約すると、ルールを決めるだけ、多重継承もしたい、とかなら、インターフェイス、共有のプロパティやメソッドを提供したい、クラスにはそれぞれ違う情報を持たせたいなら抽象クラスといった理解。