Kotlinを勉強し始めています、継承関連の復習も兼ねて、メモ。
まずKotlinの継承についてです。以下のようなAnimalクラスがあるとします。
Kotlinではopenをつけないとサブクラスが作成できません。
open class Animal {
open fun explain() = println("動物です")
}
次にAnimalクラスを継承したCatクラスを作成します。
class Cat : Animal() {
override fun explain() = println("猫です")
}
これをAnimalの型の変数に代入することができます。
val cat : Animal = Cat()
cat.explain()
この場合の結果はどうなるでしょうか?
実体としてはCatクラスのため、「猫です」が表示されます。
次に以下のDogクラスを作成します。
class Dog : Animal() {
fun bark() = println("吠える")
}
これもAnimalのサブクラスのため、Animalの型の変数に代入できます。
val dog : Animal = Dog()
dog.bark()
しかし、このコードはコンパイルエラーになります。Animalクラスはbark()を知らないためですね。
なので以下のようにダウンキャストすると、コンパイルエラーは消えます。
dog as Dog
dog.bark()
しかし、Kotlinでは、型チェックをすれば、ダウンキャストしたものとして扱ってくれる便利機能があります。
if (dog is Dog) dog.bark()
これをスマートキャストといいます。
このようにKotlinでは自動でやってくれるものが多いので、徐々に慣れていきたいと思います。