C# オーバーライドのサンプル

C#のオーバーライドのサンプルです。

目次

オーバーライド

  • クラスを継承するときに使用します。
  • 親クラスで定義したメソッドを、子クラスで同じメソッド名(引数、戻り値の型も一致)を記述して処理内容を上書きすることです。
  • 親クラスのメソッドにvirtualキーワードをつけます。
  • 子クラスのメソッドにoverrideキーワードをつけます。
  • 似た名前として、オーバーロードがありますがそれとは別です。オーバーロードと継承は関係ありません。
    C# オーバーロードのサンプル

オーバーライドのサンプル

オーバーライドのサンプルです。

using System;
class Class1
{
    public virtual string print1()
    {
        return "表示1";
    }
}
class Class2 : Class1
{
    public override string print1()
    {
        return "表示2";
    }
}
class Test1
{
    static void Main()
    {
        Class2 c2 = new Class2();
        Class1 c1 = c2;
        Console.WriteLine(c1.print1()); // 表示2
    }
}

2~8行目は親クラスです。
9~15行目は子クラスです。
4行目は、virtualキーワードが入っています。
11行目は、overrideキーワードが入っています。
11行目がオーバーライドです。4行目とメソッド名が同じで引数も同じ(なし)です。

22行目の変数「c1」は、親クラスの型の変数ですが、オーバーライドで子クラス「Class2」のprint1メソッドが実行されます。

 

オーバーライドではないサンプル

上記のコードからvirtualとoverrideを指定しない場合のサンプルです。

using System;
class Class1
{
    public string print1()
    {
        return "表示1";
    }
}
class Class2 : Class1
{
    public string print1()
    {
        return "表示2";
    }
}
class Test1
{
    static void Main()
    {
        Class2 c2 = new Class2();
        Class1 c1 = c2;
        Console.WriteLine(c1.print1()); // 表示1
    }
}

2~8行目は親クラスです。
9~15行目は子クラスです。

22行目の変数「c1」は、親クラスの型の変数です。親クラス「Class1」のprint1メソッドが実行されます。

 

overrideのメソッドをオーバーライドする

overrideキーワードのメソッドをオーバーライドするサンプルです。

using System;
class Class1
{
     public virtual string print1()
    {
        return "表示1";
    }
}
class Class2 : Class1
{
    public override string print1()
    {
        return "表示2";
    }
}
class Class3 : Class2
{
    public override string print1()
    {
        return "表示3";
    }
}
class Test1
{
    static void Main()
    {
        Class3 c3 = new Class3();
        Class1 c1 = c3;
        Console.WriteLine(c1.print1()); // 表示3
    }
}

18行目は、11行目のoverrideキーワードのメソッドをオーバーライドしています。
この場合、18行目もoverrideキーワードを指定します。
29行目は、18行目のメソッドが実行されます。

子クラスから親クラスを参照する(base)

子クラスから親クラスを参照するサンプルです。
baseキーワードを使用してオーバーライドした子クラスのメソッドから親クラスのメソッドを呼びます。

using System;
class Class1
{
    public virtual string print1()
    {
        return "表示1";
    }
}
class Class2 : Class1
{
    public override string print1()
    {
        Console.WriteLine(base.print1());
        return "表示2";
    }
}
class Test1
{
    static void Main()
    {
        Class2 c2 = new Class2();
        Class1 c1 = c2;
        Console.WriteLine(c1.print1()); // 表示1 表示2
    }
}

11行目は、4行目のメソッドをオーバーライドしています。
13行目は、baseキーワードを使用して親クラスのメソッドを呼んでいます。
23行目は、親クラスと子クラスのメソッドの実行結果が表示されます。

オーバーライドの禁止(sealed)

メソッドの前にsealedキーワードをつけるとオーバーライドが禁止されます。

using System;
class Class1
{
     public sealed virtual string print1()
    {
        return "表示1";
    }
}
class Class2 : Class1
{
//    public override string print1()
//    {
//        return "表示2";
//    }
}
class Test1
{
    static void Main()
    {
        Class2 c2 = new Class2();
        Class1 c1 = c2;
        Console.WriteLine(c1.print1()); //
    }
}

11行目は、4行目のメソッドをオーバーライドしようとしていますが、4行目のメソッドの前にsealedがついているので不可です。コンパイルエラーになります。

virtual

override

関連の記事

C#入門 クラスの仕組みとサンプル
C# コンストラクタのサンプル
C# クラスの継承の仕組みとサンプル
C# オーバーロードのサンプル
C# パーシャルクラスのサンプル

△上に戻る