OOP のいくつかの概念virtual
、、についてかなり混乱しています。違いを説明してくれる人はいますか?override
new
sealed 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 を指定した場合と同じになりますが、コンパイラの警告も表示されます (基本クラス メソッドでメソッドを隠していることに気付いていないか、実際にオーバーライドしたかったがキーワードを含めるのを忘れただけの場合があるため)。
オーバーライドプロパティ宣言には、封印された修飾子。この修飾子を使用すると、派生クラスがプロパティをさらにオーバーライドできなくなります。シールされたプロパティのアクセサーもシールされます。