抽象クラスから継承するクラスを作成し、継承した抽象クラスを実装するときに、overrideキーワードを使用する必要があるのはなぜですか。
"なぜ?" このような質問はあいまいなので、答えるのが難しい場合があります。私はあなたの質問が「overrideキーワードが必要であるという立場を主張するために言語設計の間にどんな議論がなされ得るか」であると仮定します。
まず、一歩下がってみましょう。Javaなどの一部の言語では、メソッドはデフォルトで仮想であり、自動的にオーバーライドされます。C#の設計者はこれを認識しており、Javaのマイナーな欠陥であると考えていました。C#は「バカなパーツが取り除かれたJava」ではありませんが、C#の設計者はC、C ++、Javaの問題のある設計ポイントから学び、C#でそれらを複製しないことに熱心でした。
C#の設計者は、オーバーライドがバグの原因である可能性があると考えました。結局のところ、これは既存のテスト済みコードの動作を変更する方法であり、危険です。オーバーライドは、何気なくまたは偶然に行われるべきものではありません。それはそれについて熱心に考えている誰かによって設計されるべきです。そのため、デフォルトではメソッドは仮想ではなく、メソッドをオーバーライドしていると言う必要があります。
それが基本的な推論です。ここで、さらに高度な推論に進むことができます。
StriplingWarriorの答えは、より高度な議論をする上での最初の切り口となります。派生クラスの作成者は、基本クラスについて知らされていない可能性があり、新しいメソッドを作成しようとしている可能性があり、ユーザーが誤ってオーバーライドできないようにする必要があります。
この点は理にかなっていますが、次のような多くの反論があります。
- 派生クラスの作成者は、基本クラスに関するすべてを知る責任があります。彼らはそのコードを再利用しており、再利用する前にそのコードを完全に理解するために十分な注意を払う必要があります。
- 特定のシナリオでは、仮想メソッドは抽象的です。オーバーライドしないとエラーになるので、作成者が誤って実装を作成することはまずありません。
次に、この点についてさらに高度な議論をしましょう。派生クラスの作成者は、どのような状況で基本クラスが何をしているのかわからないことを許されますか? さて、このシナリオを検討してください:
- 基本クラスの作成者は、抽象基本クラスBを作成します。
- 別のチームの派生クラスの作成者は、メソッドMを使用して派生クラスDを作成します。
- 基本クラスの作成者は、基本クラスBを拡張するチームが常にメソッドMを提供する必要があることを理解しているため、基本クラスの作成者は抽象メソッドMを追加します。
- クラスDを再コンパイルするとどうなりますか?
私たちが起こしたいのは、Dの作者に関連する何かが変更されたという知らせがあることです。変更された関連事項は、Mが要件になり、実装をオーバーロードする必要があることです。 DMは、基本クラスから呼び出すことができることがわかったら、その動作を変更する必要があるかもしれません。 正しいことは、「ああ、DMは存在し、BMを拡張する」と黙って言うのではありません。コンパイラが行う正しいことはfailであり、「Dの作者、もう有効ではないあなたの仮定を確認し、必要に応じてコードを修正してください」と言います。
あなたの例では、抽象メソッドをオーバーライドしているため、overrideがオプションであったと仮定しSayHelloます。2つの可能性があります:(1)コードの作成者が抽象メソッドをオーバーライドしようとしている、または(2)誰かがベースクラスを変更したためにオーバーライドメソッドが誤ってオーバーライドされ、コードが微妙に間違っている。 オプションである場合、これらの可能性を区別することはできませんoverride。
しかし、必要な場合overrideは、3つのシナリオを区別できます。コードで可能な間違いがある場合は、されて行方不明。意図的に上書きする場合は存在します。そしてそれが意図的に上書きされていない場合は存在します。C#の設計により、これらの微妙な区別を行うことができます。 overrideoverridenew
コンパイラエラーレポートを作成するには、開発者の心を読む必要があることに注意してください。コンパイラは、作成者が考えていた正しいコードを間違ったコードから推定し、それらを正しい方向に向けるエラーを提供する必要があります。開発者が考えていたことについてコードに残せる手がかりが多いほど、コンパイラーがエラーを報告する際の作業が改善されるため、バグをより早く見つけて修正することができます。
しかし、より一般的には、C#はコードが変更される世界向けに設計されました。「奇数」のように見えるC#の非常に多くの機能が実際にあります。これは、基本クラスが変更されたために以前は有効であったという仮定が無効になったときに開発者に通知するためです。このクラスのバグは「脆弱な基本クラスの障害」と呼ばれ、C#には、この障害クラスに対する多くの興味深い緩和策があります。