Kotlinの継承の基本!親クラス・子クラスの関係とoverrideの使い方を初心者向けに徹底解説
生徒
「Kotlinの継承ってどういうことなんですか?親クラスとか子クラスって聞くけど難しそう…」
先生
「Kotlinの継承は、あるクラスの機能を別のクラスが引き継いで使える仕組みです。親から子に知識を渡すようなイメージですね。」
生徒
「なるほど。でも、実際にどうやって書けばいいのか分かりません…」
先生
「それでは、Kotlinの継承の書き方や、overrideの使い方を一つずつ丁寧に見ていきましょう!」
1. Kotlinにおける継承(けいしょう)とは?
プログラミングで「継承(けいしょう)」とは、あるクラスの性質や機能を別のクラスが引き継ぐことを意味します。
例えば、「動物」という親クラスがあり、その子クラスとして「犬」や「猫」がいるようなイメージです。
親クラスをKotlinでは「スーパークラス」、子クラスは「サブクラス」と呼びます。
2. 親クラスと子クラスを定義する基本構文
親クラスはopenキーワードを使って作ります。Kotlinでは、デフォルトではクラスは継承できないようになっているため、継承を許可するにはopenが必要です。
open class Animal {
fun sleep() {
println("眠っています")
}
}
上記が親クラス(スーパークラス)です。
次に、それを継承する子クラス(サブクラス)を作ります。
class Dog : Animal() {
fun bark() {
println("ワンワン!")
}
}
: Animal()と書くことでAnimalクラスを継承しています。
3. 子クラスで親クラスの関数を使う
親クラスの機能は、子クラスでもそのまま使うことができます。
fun main() {
val dog = Dog()
dog.sleep()
dog.bark()
}
眠っています
ワンワン!
sleep()は親クラスの関数ですが、子クラスのDogでも使えるのがポイントです。
4. override(オーバーライド)とは?
override(オーバーライド)は、親クラスで定義された関数を、子クラスで書き換える(上書きする)ときに使うキーワードです。
親のルールを子どもが自分なりに変えるようなイメージです。
open class Animal {
open fun makeSound() {
println("何かの動物の鳴き声")
}
}
class Cat : Animal() {
override fun makeSound() {
println("ニャー!")
}
}
5. overrideで動作を変えてみよう
先ほどのmakeSound()を実際に呼び出すと、次のような動作になります。
fun main() {
val cat = Cat()
cat.makeSound()
}
ニャー!
このように、親クラスのmakeSound()ではなく、子クラスでoverrideされた内容が実行されます。
6. overrideにはルールがある
親クラスの関数をoverrideするには、その関数もopenで宣言されている必要があります。
openは「この関数は子クラスで書き換えていいよ」という意味です。
逆に、openがついていない関数は、overrideできません。
7. overrideとsuperの使い方
superキーワードを使うと、親クラスの関数を呼び出すことができます。つまり「もとの機能+自分の機能」を組み合わせることができるんです。
open class Animal {
open fun greet() {
println("こんにちは!")
}
}
class Bird : Animal() {
override fun greet() {
super.greet()
println("チュンチュン!")
}
}
fun main() {
val bird = Bird()
bird.greet()
}
こんにちは!
チュンチュン!
super.greet()で親のgreet()を実行したあと、Bird独自のメッセージも追加しています。
8. 実生活に例えるKotlinの継承とoverride
親クラスは「共通の特徴」をまとめた設計図、子クラスは「それをもとに作られた実物」と考えるとわかりやすいです。
例えば、「乗り物」という親クラスがあれば、そこから「車」や「自転車」などを継承して、それぞれに合った動き(override)をさせることができます。
Kotlinの継承とoverrideは、コードを整理しやすく、再利用しやすくするためにとても大切な考え方です。
まとめ
Kotlinにおける継承(けいしょう)は、親クラス(スーパークラス)の機能や性質を子クラス(サブクラス)が引き継いで再利用する仕組みです。この記事では、Kotlinのクラス継承の基本から、openキーワードによる継承の許可、overrideによる関数の上書き方法、さらにsuperを使った親クラスの呼び出しなど、実際のコードを交えて分かりやすく解説しました。
Kotlinでは、デフォルトですべてのクラスは継承不可になっているため、継承したいクラスにはopenを付ける必要があります。これはJavaとは異なるKotlin独自のルールで、安全性を高めるための仕組みです。
また、親クラスの関数を子クラスで上書き(オーバーライド)したい場合には、親の関数にもopenをつけ、子ではoverrideを記述します。このようなルールを守ることで、意図しない動作やエラーを防ぎながら柔軟に機能を拡張できます。
実際のコード例として、「動物(Animal)」という親クラスを作成し、そこから「犬(Dog)」「猫(Cat)」「鳥(Bird)」といった子クラスを継承し、それぞれが固有の動作を持つ形を実装しました。こうした設計を使えば、コードの再利用性が高まり、プログラムが整理されてメンテナンスしやすくなります。
さらに、superを使うことで、親の動作に子独自の動作を追加することも可能です。たとえば、「こんにちは!」という挨拶を基本としつつ、「チュンチュン!」という鳥独自のメッセージを追加するなど、拡張性の高いコードを書くことができます。
Kotlinの継承は、単にコードを短くするためだけでなく、「共通のルールをベースに、個別の特徴を加えていく」ための重要な考え方です。これからプログラムを大きく作っていく場面では、この継承とoverrideの使い方がとても重要になりますので、しっかりと理解しておきましょう。
サンプル:Kotlinの継承とoverrideの応用
open class Vehicle {
open fun move() {
println("移動中")
}
}
class Car : Vehicle() {
override fun move() {
super.move()
println("車で走っています")
}
}
fun main() {
val car = Car()
car.move()
}
このコードでは、VehicleクラスをCarクラスが継承しており、move()関数をoverrideしつつ、super.move()で親の処理も呼び出しています。Kotlinの継承とoverrideの基本をしっかり活用した例です。
生徒
「Kotlinの継承って、親クラスの機能を引き継げるっていうことなんですね!」
先生
「その通りです。親から子へと機能を渡すことで、同じコードを繰り返さずに済みますし、プログラムの構造もきれいになりますよ。」
生徒
「でも、全部勝手に継承できるわけじゃないんですね。openって書かないとダメなんですね。」
先生
「そうです。Kotlinでは、安全性を重視して、明示的に継承を許可するようにしています。overrideも同じで、親の関数がopenじゃないと上書きできません。」
生徒
「superを使えば、親の動きもそのまま使えるのが便利ですね。組み合わせもできるから自由度が高いなと思いました!」
先生
「継承とoverrideをうまく使えば、共通の機能は親にまとめて、個性は子で追加するという考え方ができます。今後の開発にも必ず役立ちますよ。」
生徒
「はい!今回の例をベースに、もっと複雑なクラスも作ってみたくなりました!」