C#のオーバーライドのサンプルです。
目次
サンプル | オーバーライド |
オーバーライドのサンプル | |
オーバーライドではないサンプル | |
overrideのメソッドをオーバーライドする | |
子クラスから親クラスを参照する(base) | |
オーバーライドの禁止(sealed) |
オーバーライド
- クラスを継承するときに使用します。
- オブジェクトを生成してメソッドを実行する時、変数の型ではなく、インスタンスの型でメソッドを実行します。
- 親クラスのメソッドに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()
{
Class1 c1 = new Class2();
Console.WriteLine(c1.print1()); // 表示2
}
}
2~8行目は親クラスです。
9~15行目は子クラスです。
4行目は、virtualキーワードが入っています。
11行目は、overrideキーワードが入っています。
11行目がオーバーライドです。4行目とメソッド名が同じで引数も同じ(なし)です。
20行目は、子クラスのインスタンスを生成しています。
22行目は、子クラス「Class2」のprint1メソッドが実行されます。
オーバーライドなので変数の型(Class1)ではなくインスタンスの型(Class2)でメソッドが実行されます。
オーバーライドではないサンプル
上記のコードからvirtualとoverrideを指定しない場合のサンプルです。
using System;
class Class1
{
public string print1()
{
return "表示1";
}
}
class Class2 : Class1
{
public string print1()
{
return "表示2";
}
}
class Test1
{
static void Main()
{
Class1 c1 = new Class2();
Console.WriteLine(c1.print1()); // 表示1
}
}
2~8行目は親クラスです。
9~15行目は子クラスです。
20行目は、子クラスのインスタンスを生成しています。
22行目は、親クラス「Class1」のprint1メソッドが実行されます。
オーバーライドではないので、インスタンスの型(Class2)ではなく変数の型(Class1)でメソッドが実行されます。
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 c1 = new Class3();
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()
{
Class1 c1 = new Class2();
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()
{
Class1 c1 = new Class2();
Console.WriteLine(c1.print1()); //
}
}
11行目は、4行目のメソッドをオーバーライドしようとしていますが、4行目のメソッドの前にsealedがついているので不可です。コンパイルエラーになります。
virtual
- 派生クラスでオーバーライドできるようにします。
- 以下は、MicrosoftのC#のvirtualのリンクです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/virtual
override
- オーバーライドします。
- 以下は、MicrosoftのC#のoverrideのリンクです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/override
関連の記事
C#入門 クラスの仕組みとサンプル
C# コンストラクタのサンプル
C# クラスの継承の仕組みとサンプル
C# オーバーロードのサンプル
C# パーシャルクラスのサンプル