仮想、オーバーライド、新規、シールオーバーライドの違い 質問する

仮想、オーバーライド、新規、シールオーバーライドの違い 質問する

OOP のいくつかの概念virtual、、についてかなり混乱しています。違いを説明してくれる人はいますか?overridenewsealed override

override派生クラスのメソッドを使用する場合、キーワードを使用して、基本クラスのメソッドを派生クラスでオーバーライドできることは明らかです。ただし、、newおよびについてはよくわかりませんsealed override

ベストアンサー1

バーチャルキーワードは、メソッド、プロパティ、インデクサー、またはイベントの宣言を変更し、派生クラスでオーバーライドできるようにするために使用されます。たとえば、このメソッドは、それを継承する任意のクラスによってオーバーライドできます。基本クラスから継承されたメンバーを明示的に非表示にするには、new 修飾子を使用します。継承されたメンバーを非表示にするには、同じ名前を使用して派生クラスで宣言し、new 修飾子で変更します。

これはすべてポリモーフィズムに関係しています。仮想メソッドが参照で呼び出されると、参照が参照するオブジェクトの実際の型を使用して、どのメソッド実装を使用するかが決定されます。基本クラスのメソッドが派生クラスでオーバーライドされると、呼び出しコードがオブジェクトが派生クラスのインスタンスであることを「認識」していなくても、派生クラスのバージョンが使用されます。たとえば、次のようになります。

public class Base {
    public virtual void SomeMethod() {
    }
}

public class Derived : Base {
    public override void SomeMethod() {
    }
}

...

Base d = new Derived();
d.SomeMethod();

Base.SomeMethod をオーバーライドする場合は、Derived.SomeMethod を呼び出すことになります。

さて、新しいキーワードの代わりにオーバーライド派生クラスのメソッドは基本クラスのメソッドをオーバーライドせず、単にそれを非表示にするだけです。その場合は、次のようなコードになります。

public class Base {
    public virtual void SomeOtherMethod() {
    }
}

public class Derived : Base {
    public new void SomeOtherMethod() {
    }
}

...


Base b = new Derived();
Derived d = new Derived();
b.SomeOtherMethod();
d.SomeOtherMethod();

最初に Base.SomeOtherMethod を呼び出し、次に Derived.SomeOtherMethod を呼び出します。派生メソッドが基本メソッドをオーバーライドするのではなく、実質的には、同じ名前を持つ 2 つの完全に別のメソッドです。

new または overrides のどちらも指定しない場合、結果の出力は new を指定した場合と同じになりますが、コンパイラの警告も表示されます (基本クラス メソッドでメソッドを隠していることに気付いていないか、実際にオーバーライドしたかったがキーワードを含めるのを忘れただけの場合があるため)。

オーバーライドプロパティ宣言には、封印された修飾子。この修飾子を使用すると、派生クラスがプロパティをさらにオーバーライドできなくなります。シールされたプロパティのアクセサーもシールされます。

おすすめ記事