Kotlinの継承の基本!親クラス・子クラスの関係とoverrideの使い方を初心者向けに徹底解説
生徒
「Kotlinの継承ってどういうことなんですか?親クラスとか子クラスって聞くけど難しそう…」
先生
「Kotlinの継承は、あるクラスの機能を別のクラスが引き継いで使える仕組みです。親から子に知識を渡すようなイメージですね。」
生徒
「なるほど。でも、実際にどうやって書けばいいのか分かりません…」
先生
「それでは、Kotlinの継承の書き方や、overrideの使い方を一つずつ丁寧に見ていきましょう!」
1. Kotlinにおける継承(けいしょう)とは?
プログラミングで「継承(けいしょう)」とは、あるクラスが持つ機能や性質を、別のクラスに引き継いで使えるようにする仕組みのことです。
たとえば、動物には「眠る」「鳴く」といった共通の動きがありますよね。この共通部分をまとめて「動物」という親クラスにしておき、それをもとに「犬」「猫」などの子クラスが作られる、というイメージです。
整理すると、親になるクラスをKotlinでは「スーパークラス」、そこから生まれる子のクラスを「サブクラス」と呼びます。スーパークラスの機能をコピーして使えるので、同じ処理を何度も書かなくてもよくなり、とても便利です。
たとえば、こんな簡単なコードで考えてみましょう。
open class Animal {
fun sleep() {
println("動物が眠っています")
}
}
class Dog : Animal() // Animalを継承
Dogクラスには何も書いていませんが、Animalを継承しているので、中にあるsleep()をそのまま使うことができます。
fun main() {
val dog = Dog()
dog.sleep()
}
動物が眠っています
このように、継承を使うことで共通部分をまとめて再利用でき、コードがスッキリします。まずは「親クラスの機能を、子クラスがそのまま使える仕組み」と覚えておけば大丈夫です。
2. 親クラスと子クラスを定義する基本構文
実際に継承を書くときは、まず「親クラス」を作るところから始まります。Kotlinでは、親クラスをそのままでは継承できないため、openキーワードをつけることで「このクラスは継承していいよ」という宣言をします。
open class Animal {
fun sleep() {
println("動物が眠っています")
}
}
これがスーパークラスです。中には「動物なら誰でも持っていそうな行動」をまとめておくイメージです。
次に、Animalを継承したサブクラスを作ります。書き方はとてもシンプルで、クラス名の後ろに: 親クラス名()と書くだけです。
class Dog : Animal() {
fun bark() {
println("ワンワン!")
}
}
たったこれだけで、DogはAnimalの持っているsleep()を自動的に使えるようになります。
実際に呼び出すとどうなるのか、確認してみます。
fun main() {
val dog = Dog()
dog.sleep() // 親クラスの機能
dog.bark() // 子クラス固有の機能
}
動物が眠っています
ワンワン!
このように、親クラスで定義した関数を、子クラス側で特別な設定なしに使えるのが継承の大きな特徴です。「親クラスで共通の処理」「子クラスで自分だけの処理」と分けて書くことで、コードが整理しやすくなります。
3. 子クラスで親クラスの関数を使う
親クラスの機能は、子クラスでもそのまま使うことができます。
fun main() {
val dog = Dog()
dog.sleep()
dog.bark()
}
眠っています
ワンワン!
sleep()は親クラスの関数ですが、子クラスのDogでも使えるのがポイントです。
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazon広告リンク
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をうまく使えば、共通の機能は親にまとめて、個性は子で追加するという考え方ができます。今後の開発にも必ず役立ちますよ。」
生徒
「はい!今回の例をベースに、もっと複雑なクラスも作ってみたくなりました!」