overrideキーワードの詳しい説明(再掲)
序文
C# にはオーバーライド、オーバーロード、上書きの概念があり、対応するキーワードは override、overload、new です。この記事では主に override キーワードを紹介し、主にこの記事 C# の書き換え (override ) を参照します。
文章
1. 書き換え、オーバーロード、および上書きの概要
1. オーバーライド
オーバーライド: サブクラスは、必要に応じて親クラスのメソッド本体を書き換えます。オーバーライドされたメソッドと親クラスのメソッドのアクセス権限、戻り値、メソッド名、パラメーターは変更されません。
2. オーバーロード
オーバーロード: 異なる要件に従って、クラス内に同じメソッド名を持つ複数のメソッドを作成します。メソッド名は同じですが、パラメーターの型や数を同じにすることはできず、戻り値の型をオーバーロードの兆候として使用することはできません。 。
3.上書き(新規)
上書き: new を使用して実装されます。サブクラスで new キーワードを使用して、親クラスと同じ名前で定義されたメソッドを変更することは、上書きとも呼ばれます。上書きしても、親クラスのメソッドの機能は変更されません。
2. 書き換えの具体例
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
A a = new B();
a.Print();
}
}
class A
{
public A()
{
//构造函数
Print();
}
public virtual void Print()
{
Console.WriteLine("我是A类");
}
}
class B:A
{
public B()
{
//构造函数
Print();
}
public override void Print()
{
Console.WriteLine("我是B类"); //重写Print()方法
}
}
}
上記のコードでは、クラス A が親クラス、クラス B がサブクラスで、クラス A の Print() メソッドがオーバーライドされます。
3. 親クラスのメソッドをオーバーライドする条件
- 親クラスのメソッドは、サブクラスでオーバーライドする前に、virtual キーワードを使用して変更する必要があります。親クラスのメソッドが virtual キーワードを使用しない場合、サブクラスで親クラスのメソッドをオーバーライドするときにコンパイル エラーが発生します。
- 仮想メソッド: 基本クラスで定義され、派生クラスでオーバーライドできるメソッドは、virtual キーワードを使用して定義されます。
- 親クラスをサブクラスで書き換えるときは、override キーワードを識別子として使用する必要があります。
- たとえば、クラス B がクラス A を継承し、クラス A の Print() メソッドをオーバーライドする場合、override キーワードが使用されていないと、次の警告が表示されます。
4. 親クラスのメソッドがサブクラスによってオーバーライドされた後、親クラスを指すようにサブクラス オブジェクトが作成されるとき、オーバーライドされたメソッドが呼び出されるとき、親クラスのメソッドが呼び出されますか、それともサブクラスのメソッドが呼び出されますか?
親クラスのメソッドがサブクラスによってオーバーライドされた場合、サブクラスのインスタンスが作成されている限り、オーバーライドされたメソッドが呼び出されたときに、最終的にサブクラス内のメソッドが実行されます。
コードを実行した結果:
- サブクラスのインスタンスを作成するときは、サブクラスのコンストラクターが最初に実行されますが、親クラスのコンストラクターが最初に実行されます。
- 親クラスのコンストラクターで Print() メソッドを実行するときは、最初に Print() メソッドがオーバーライドされているかどうかを確認し、メソッドがオーバーライドされている場合は、サブクラスのオーバーライドされたメソッドが実行されます。
- 親クラスのコンストラクターが実行された後、サブクラスのコンストラクターが実行されます。サブクラスのコンストラクターが Print() 関数を呼び出すと、最初にサブクラスに Print() メソッドが含まれているかどうかが判断されます。含まれている場合は、そのメソッドが呼び出されます。独自の Print() メソッド、そうでない場合は親クラスの Print() メソッドを呼び出します。
- 最後に、a.Print() は、まずクラス A の Print() メソッドがオーバーライドされているかどうかを確認し、オーバーライドされている場合は、クラス B の Print() メソッドを呼び出します。
5. サブクラスのオーバーライドされたメソッドが override キーワードではなく new キーワードによって変更された場合、親クラスのメソッドがオーバーライドされるかどうか
new キーワードで変更された後、Print() メソッドはオーバーライドされたメソッドではなく、クラス B の新しいメソッドになります。
上図の実行結果は、 new キーワードが使用されると、それが親クラスに関連している限り、実行される Print() メソッドは親クラスの Print() メソッドを実行することを示しています。