Swiftの継承とオーバーライドの基本を解説!初心者でもわかるクラスの再利用と上書きの仕組み
生徒
「Swiftで“継承”とか“オーバーライド”って言葉を聞いたんですが、なんだか難しそうです…」
先生
「たしかに最初はピンと来ないかもしれないね。でも“継承”は『あるクラスの機能を受け継ぐ』ことで、“オーバーライド”は『受け継いだ機能を上書きする』ことなんですよ。」
生徒
「なるほど…でもどうやって書くのかは分からないです。」
先生
「それじゃあ、Swiftのクラス継承とオーバーライドの使い方を、例を交えて順番に説明していくね!」
1. Swiftにおける継承とは?
Swift(スウィフト)の継承(けいしょう)は、あるクラスの機能を別のクラスが引き継いで使えるようにする仕組みです。
たとえば、「動物」という基本のクラスを作って、それを「犬」や「猫」が引き継げば、共通の動き(例えば歩くなど)を再利用できるようになります。
Swiftで継承を使うときは、: 親クラス名のようにコロンを使って書きます。
2. 継承の基本的な書き方
次の例では、Animalクラスを親として、Dogクラスがそれを継承しています。
class Animal {
func speak() {
print("なにか動物の鳴き声")
}
}
class Dog: Animal {
}
let d = Dog()
d.speak()
なにか動物の鳴き声
Dogクラスにはspeak()メソッドを書いていませんが、Animalから継承しているので使うことができます。
3. オーバーライド(override)とは?
オーバーライドとは、親クラスで定義されたメソッドを子クラスで上書きして、自分用の処理に変えることです。
Swiftではoverrideというキーワードを使って書きます。
class Dog: Animal {
override func speak() {
print("ワンワン!")
}
}
let dog = Dog()
dog.speak()
ワンワン!
このように、親クラスにあるspeak()メソッドをDogクラスで上書きすることで、オリジナルの鳴き声を出せるようになります。
4. オーバーライドするときの注意点
Swiftでは、必ずoverrideキーワードをつけてオーバーライドしないとエラーになります。
また、親クラスのメソッドがfinalで指定されている場合は、オーバーライドができません。
class Animal {
final func walk() {
print("歩いています")
}
}
class Cat: Animal {
// このように書くとエラーになる
// override func walk() { ... }
}
finalは「このメソッドはオーバーライド禁止ですよ」という意味なので、設計上変えてほしくない処理に使われます。
5. プロパティもオーバーライドできる
Swiftでは、メソッドだけでなくプロパティ(変数や定数)もオーバーライドすることができます。
たとえば、親クラスのmessageというプロパティを、子クラスで変更する例です。
class Animal {
var message: String {
return "なんらかの動物"
}
}
class Bird: Animal {
override var message: String {
return "チュンチュン"
}
}
let b = Bird()
print(b.message)
チュンチュン
このように、プロパティもoverrideを使って変更可能です。ただし、読み取り専用(getのみ)である必要があります。
6. 親クラスの処理を残したまま追加する
子クラスでオーバーライドする際に、親クラスの処理も残しておきたい場合はsuperを使います。
superは「親クラスの処理を呼び出す」という意味です。
class Animal {
func eat() {
print("何かを食べています")
}
}
class Monkey: Animal {
override func eat() {
super.eat()
print("バナナを食べました")
}
}
let m = Monkey()
m.eat()
何かを食べています
バナナを食べました
このように、superを使うことで、親クラスの処理を活かしながら、自分の処理を追加できます。
7. 継承とオーバーライドを使うメリット
Swiftで継承とオーバーライドを使うと、共通処理をまとめて再利用したり、クラスごとの違いを簡単に表現できるというメリットがあります。
たとえば次のようなケースで役立ちます:
- 動きが似ているけど少しだけ違うオブジェクトを作りたいとき
- 基本機能は共通で、個別にカスタマイズしたいとき
- コードの重複を減らして整理したいとき
オブジェクト指向の考え方を理解するうえでも、「継承」と「オーバーライド」はとても大切なキーワードです。