【C#学習記(1)】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. 親クラスのメソッドをオーバーライドする条件

  1. 親クラスのメソッドは、サブクラスでオーバーライドする前に、virtual キーワードを使用して変更する必要があります。親クラスのメソッドが virtual キーワードを使用しない場合、サブクラスで親クラスのメソッドをオーバーライドするときにコンパイル エラーが発生します。
  2. 仮想メソッド: 基本クラスで定義され、派生クラスでオーバーライドできるメソッドは、virtual キーワードを使用して定義されます。
  3. 親クラスをサブクラスで書き換えるときは、override キーワードを識別子として使用する必要があります。
  4. たとえば、クラス B がクラス A を継承し、クラス A の Print() メソッドをオーバーライドする場合、override キーワードが使用されていないと、次の警告が表示されます。
    ここに画像の説明を挿入します

4. 親クラスのメソッドがサブクラスによってオーバーライドされた後、親クラスを指すようにサブクラス オブジェクトが作成されるとき、オーバーライドされたメソッドが呼び出されるとき、親クラスのメソッドが呼び出されますか、それともサブクラスのメソッドが呼び出されますか?

親クラスのメソッドがサブクラスによってオーバーライドされた場合、サブクラスのインスタンスが作成されている限り、オーバーライドされたメソッドが呼び出されたときに、最終的にサブクラス内のメソッドが実行されます。

コードを実行した結果:
ここに画像の説明を挿入します

  1. サブクラスのインスタンスを作成するときは、サブクラスのコンストラクターが最初に実行されますが、親クラスのコンストラクターが最初に実行されます。
  2. 親クラスのコンストラクターで Print() メソッドを実行するときは、最初に Print() メソッドがオーバーライドされているかどうかを確認し、メソッドがオーバーライドされている場合は、サブクラスのオーバーライドされたメソッドが実行されます。
  3. 親クラスのコンストラクターが実行された後、サブクラスのコンストラクターが実行されます。サブクラスのコンストラクターが Print() 関数を呼び出すと、最初にサブクラスに Print() メソッドが含まれているかどうかが判断されます。含まれている場合は、そのメソッドが呼び出されます。独自の Print() メソッド、そうでない場合は親クラスの Print() メソッドを呼び出します。
  4. 最後に、a.Print() は、まずクラス A の Print() メソッドがオーバーライドされているかどうかを確認し、オーバーライドされている場合は、クラス B の Print() メソッドを呼び出します。

5. サブクラスのオーバーライドされたメソッドが override キーワードではなく new キーワードによって変更された場合、親クラスのメソッドがオーバーライドされるかどうか

new キーワードで変更された後、Print() メソッドはオーバーライドされたメソッドではなく、クラス B の新しいメソッドになります。
ここに画像の説明を挿入します
上図の実行結果は、 new キーワードが使用されると、それが親クラスに関連している限り、実行される Print() メソッドは親クラスの Print() メソッドを実行することを示しています。

おすすめ

転載: blog.csdn.net/sallyyellow/article/details/131719300