オーバーライド
C#のオーバーライドの特徴として、以下が挙げられる。
仮想メソッドおよび抽象メソッドのオーバーライドの際にoverrideキーワードの指定が必要である。
ただし、インターフェイスのメソッドを実装する場合は、overrideの指定は不要 (不可) である。
メソッドは既定では非仮想であり、virtualを指定することでオーバーライド可能な仮想メソッドとなる。
プロパティ、インデクサ、イベントも、virtual修飾されている場合はメソッドと同様にオーバーライドの対象となる。
sealedキーワードを指定することでオーバーライドを禁止できる。
コードの例を示す。
あるスーパークラスとそれを継承したサブクラスを定義する際、JavaやC++ではオーバーライドに関係した問題が起こりうるので注意が必要である(特にスーパークラスの実装者とサブクラスの実装者が異なる場合)。Javaのインスタンスメソッドは仮想メソッドであり、あとからスーパークラスにメソッドを追加したときに、そのメソッドと同じシグネチャのメソッドが既にサブクラスに存在すると、オーバーライドしたつもりがないのに関係のないメソッドをオーバーライドしてしまうという問題が起こる。逆にオーバーライドしたつもりでも、スーパークラスのメソッドシグネチャあるいはアクセシビリティの変更や、サブクラスのメソッド定義時のtypoなどによって正しくオーバーライドできていなかった、といった問題も起こる。後者の問題を回避するためにJavaでは@Overrideの指定が推奨されるが、後方互換性を保つため、アノテーションの指定は必須とはなっていない。C++においてもC++11でoverride修飾子が導入されたが、override修飾子の指定はオプションであり必須ではない。
C#ではメソッドが既定で非仮想であり、またオーバーライドするには当初からoverride修飾子が必須なのでこの問題は起こらない。基底クラスを変更しても、破壊的な変更につながりにくくなっている。
KotlinやSwiftのような後発言語では、C#同様にオーバーライドにはoverrideの指定が必須となっている。