【Swift】クラスの継承、メソッドのオーバーライドの方法。(Swift 2.1、XCode 7.2)

2020年6月16日

クラスの継承とは

他のオブジェクト指向言語と同様に、Swiftにもクラスの継承という機能がある。

クラスの継承とは、あるクラスのプロパティ、メソッドを引き継ぎながら新しいクラスを作成することをいう。

例えば、ハンバーガーショップの社員を表すクラスに接客クラスとコッククラスというのがあるとする。接客クラスとコッククラスが持っているプロパティで「社員番号」、「名前」など両方のクラスに共通してあるものがあれば、「注文を受ける」という接客クラスならではのメソッドや、「ハンバーガーを作る」というコッククラスならではのメソッドがある。

そこで、両方のクラスに共通するプロパティやメソッドを集めたクラス(スーパークラス)を作り、スーパークラスの機能を引き継ぐかたちで接客クラス、コッククラスを作ることをクラスの継承という。スーパークラスを継承したクラスのことをサブクラスといい、サブクラスはスーパークラスの全ての機能を利用できる。

クラスの継承

 

もし、同じプロパティやメソッドがすべてのクラスに記述されていると、コードの修正が必要になった場合にすべてのクラスのコードを修正するはめになり、多大の作業量とバグを混入させる危険がある。

このようなときにクラスの継承を使えば、コード量を減らし、修正箇所を局所化できるためメンテナンスがしやすくなる。

 

サブクラスを作る

サブクラスは以下のように定義する。1つのサブクラスにつき、スーパークラスは1個しか定義できない。

 

以下のコードは社員クラスの定義したあと、社員クラスを継承して接客クラスを作った例である。社員クラスで定義したプロパティやメソッドに接客クラスのインスタンスからアクセスできている。

 

先ほど、1クラスに1個しかスーパークラスを定義できないと説明したが、場合によっては、2つのクラスのプロパティとメソッドを継承したいクラスを作りたいと思うときがある。

そんなときは以下のコードのようにクラスを継承したクラスを作り、さらに、そのクラスを継承するクラスを作ることで2つのクラスを継承したクラスにできる。

以下の例ではクラス2はクラス1を継承し、クラス3はクラス2を継承させた。その結果、クラス3はクラス1、クラス2のどちらで定義されたメソッドも使うことができる。

オーバーライド

クラスを継承したものの、あるメソッドは、スーパークラスのではなく自分で書いたメソッドを使いたい場合がある。

そのようなときは、以下のコードのようにoverrideを先頭に書いてメソッドを定義することで、スーパークラスの関数を上書きできる。これをオーバーライドという。

 

なお、スーパークラスと同じメソッド名のものをoverrideをつけずにサブクラスで定義するとコンパイルエラーになる。

 

逆に、スーパークラスに無いメソッド名をサブクラスでoverrideをつけて定義してもコンパイルエラーにしてくれる。親切だ。

 

スーパークラスのメソッドを呼び出す

スーパークラスのメソッドをオーバーライド(上書き)したけど、上書き前のメソッドを呼び出したいときがある。

そんなときは、以下のコードのようにsuperに対してオーバーライドしたメソッドを呼び出す。superとはスーパークラスのことを意味している。メソッドをオーバーライドしてもスーパークラスのメソッドが完全に消えてしまうわけでは無いのだ。

 

継承を禁止する

今までの話を聞くと、プログラムを作る人は必要なクラスがあればどんなクラスを好きなだけ継承できるように感じるが、クラスによっては、安全な作りにするために、継承させたくないクラスが出てくることがある。

そのようなときは、finalをつけてクラス宣言すると他のクラスが継承することができないクラスを記述することができる。