オーバーライドとは!?
継承した新しいクラス(サブクラス)では、継承元のクラス(スーパークラス)のメソッドを使うことが出来ます。
その時、サブクラス上で新しくメソッドを作成することもできますが、スーパークラスのメソッドを異なる機能に書き換えることができます。
したがって、スーパークラスのメソッドを上書きすることで、同じ名前のメソッドでも異なる動きをさせることが出来ます。
これらがオーバーライドです。
では、実際のコードで書いてみましょう。
クラスを定義
class MyClass { public void TestA() { MessageBox.Show("これはMyClassのAです"); } public void TestB() { MessageBox.Show("これはMyClassのBです"); } }
このようなコードを書きました。
このクラスをインスタンスしてメソッドを呼び出します。
MyClass Obj = new MyClass(); Obj.TestA(); Obj.TestB();
当然ですが、「これはMyClassのAです」に続いて、「これはMyClassのBです」が表示されます。
親クラスを継承した子クラス
class MyClass { public void TestA() { MessageBox.Show("これはMyClassのAです"); } public virtual void TestB() { MessageBox.Show("これはMyClassのBです"); } } class YourClass : MyClass { }
このように親クラスMyClassを継承した子クラスYourClass クラスを作ります。
但し、この時点では子クラスは空の状態です。
空の子クラスでも動作しちゃうんです。
MyClass Obj = new YourClass(); Obj.TestA(); Obj.TestB();
親クラスをデータ型として子クラスをインスタンス化して親クラスのメソッドを呼び出せます。
実行結果は先ほどと同様に「これはMyClassのAです」に続いて、「これはMyClassのBです」が表示されます。
メソッドをオーバーライド
親クラスMyClassのメソッドTestAを子クラスのYourClassのメソッドTestAにオバーライドするコード。
class MyClass { public virtual void TestA() { MessageBox.Show("これはMyClassのAです"); } public virtual void TestB() { MessageBox.Show("これはMyClassのBです"); } } class YourClass : MyClass { public override void TestA() { MessageBox.Show("これはYourClassのAです"); } }
子クラスYourClassをインスタンスして実行します。
MyClass Obj = new YourClass(); Obj.TestA(); Obj.TestB();
最初に「これはYourClassのAです」が表示されて、次に「これはMyClassのBです」が表示されます。
親クラスMyClassのTestAメソッドが子クラスYourClassのTestAメソッドに書き換えられたのが確認できます。
そもそもC#では1つのクラス内で同名のメソッドは存在できません。
しかし、オーバーロードという手法を使えば1つのクラス内で同名のメソッドを作ることが可能になります。
オーバーロードを使ったサンプルを作りました。
同名のメソッド
class MyClass { public void Test() { MessageBox.Show("あいうえお"); } public void Test() { MessageBox.Show("かきくけこ"); } public void Test() { MessageBox.Show("さしすせそ"); } public void Test() { MessageBox.Show("たちつてと"); } }
こんなコードを書きましたが当然、コンパイルエラーになり実行できません。
引数の型と数
同名のメソッドで引数の型や数を変えました。
class MyClass { public void Test() // ① { MessageBox.Show("あいうえお"); } public void Test(int Num) // ② { MessageBox.Show(Num.ToString()); } public void Test(string Message) // ③ { MessageBox.Show( Message ); } public void Test(int Num,string Message) // ④ { MessageBox.Show(string.Format("{0},{1}",Num,Message)); } }
① | 引数無し |
② | int型の引数が1個 |
③ | string型の引数が1個 |
④ | int型の引数1個とstring型の引数が1個 |
なんとコンパイルエラーが無くなりました。
コードを実行
MyClass Obj = new MyClass(); Obj.Test(); // ① Obj.Test(1); // ② Obj.Test("3番目"); // ③ Obj.Test(2,"4番目"); // ④
このようなコードを書いて実行します。
それぞれ〇の番号に対応したメソッドが呼び出されます。
コメント