C#を始めよう|オーバーライドを使ってみる

オーバーライドとは!?

継承した新しいクラス(サブクラス)では、継承元のクラス(スーパークラス)のメソッドを使うことが出来ます。

その時、サブクラス上で新しくメソッドを作成することもできますが、スーパークラスのメソッドを異なる機能に書き換えることができます。

したがって、スーパークラスのメソッドを上書きすることで、同じ名前のメソッドでも異なる動きをさせることが出来ます。

これらがオーバーライドです。

では、実際のコードで書いてみましょう。

クラスを定義

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番目");        //  ④

このようなコードを書いて実行します。

それぞれ〇の番号に対応したメソッドが呼び出されます。

コメント