paizaで学んだC#でのクラスの継承についてのまとめ

paizaで学んだC#でのクラスの継承についてのまとめ

765 回閲覧されました

みなさんこんにちは、jonioです。

前回はC#のクラスについて基本的な内容をまとめました。

今回はクラスの継承についてまとめます。

 

クラスの継承とは

RPGゲームの職業を例にします。

全ての職業を使う事ができる人のクラスをマスタークラスとした時にその人から賢者だけの能力を持った賢者クラスを作ったとします。

すると賢者クラスはメソッドの定義をしてなくてもマスタークラスのメソッドを使えてマスタークラスのプロパティも使う事ができます。

この様にマスタークラスの能力を使う事ができる別のクラス(賢者クラス)を作る事をクラスの継承と言います。

マスタークラス賢者クラスは名称が付いていて大元のクラスの事を基底クラスと言い継承したクラス(賢者クラス)の事を派生クラスと言います。

図にすると↓です。

 

クラスの継承のコードの書き方

まずは大元のクラスだけを書きますがBoxクラスとします。

これで「宝箱を開いた。鋼鉄の剣を手に入れた。」 と表示されますがここから派生クラスとしてjewelryBoxクラスを書きます。

コードを書く流れを説明します。

まず38行目・39行目・48行目を書きますが38行目の「class JewelryBox : Box」でBoxクラスを基底クラスとした時に派生クラスのJewelryBoxクラスを作りますという意味になります。

派生クラスの作り方のコードは「class 派生クラス名 : 基底クラス名{ }」です。

次はコンストラクタにプロパティの設定をします、40行目〜42行目です。

基底クラスでは25行目〜28行目にコンストラクタがありますがこの場合は派生クラスにもコンストラクタを書かないとエラーになるので気をつけましょう。

40行目ですが「public JewelryBox(String item)」の後ろに「: base(item)」を付けます。

item」ですが規定クラスの引数になります。

44行目〜47行目は派生クラスで使うメソッドですがこれはなくてもいいです。

次はコンストラクタを呼び出す為にインスタンスを生成するのですが12行目でコードの書き方は基底クラスの時と同じです。

13行目・14行目でメソッドを呼び出していますが基底クラスと書き方は同じです。

14行目は派生クラスで基底クラスのメソッドを呼び出しています。

 

メソッドのオーバーライド

基底クラスのメソッドを派生クラスのメソッドで内容の書き換えをするのをオーバーライドと言います。

具体的にコードを見ていきますがまずはオーバーライドしないコードです。

これで「宝箱を開いた。鋼鉄の剣を手に入れた。宝箱は怪しく輝いている宝箱を開いた。モノマネモンスターを手に入れた。」 と表示されます。

次は25行目のOpenメソッドをオーバーライドします。

コードを↓にします。

コードの手順ですがまずオーバーライドするOpenメソッド (45行目〜48行目)のvoidの前に「override」をつけますがこれでオーバーライドする事になります。

そしてオーバーライドする元になる規定クラスのメソッド(仮想メソッドと言います)の「void」の前に「virtual」を付けます。

これでオーバーライドの完成で「宝箱を開いた。鋼鉄の剣を手に入れた。宝箱は怪しく輝いている宝箱を開いた。モノマネモンスターが襲ってきた」と表示されます。

 

メソッドのオーバーロード

オーバーロードは同じメソッドの内容を書き換えるだけでなく引数の数や型を変える事ができます。

これはクラスの中でなくても使えます。

まずはオーバーロードなしのメソッドを考えます。

これで「勇者は敵を攻撃した」と表示されます。

「敵」ですが引数で表示したい場合もあるはずです。

こんな場合はオーバーロードを使います。

これで「勇者は敵を攻撃した。勇者はスライムを攻撃した」と表示されますがオーバーロードを使えば同じメソッドに対して引数ありとなしの場合でメソッドを使い分ける事ができます。

今は引数の型が「string」で同じですが変える事もできます。

これで「勇者は敵を攻撃した勇者はスライムを攻撃した勇者は10匹の敵を攻撃した」 と表示されます。

今は引数が1つで型を変えていますが混在する事もできます。

これで「勇者は敵を攻撃した勇者はスライムを攻撃した勇者は10匹の敵を攻撃した勇者は5匹のモンスターを攻撃した」と表示されます。

この様に引数の数や型によって同じメソッドでも処理を分ける事ができます。

だから同じ様な処理内容だったらメソッドを変えるのではなくオーバーロードを使った方がコードの可読性が悪くならないと思います。