抽象メソッドでは new/override が必要であるのに、仮想メソッドでは必要でないのはなぜですか?
サンプル 1:
abstract class ShapesClass
{
abstract public int Area(); // abstract!
}
class Square : ShapesClass
{
int x, y;
public int Area() // Error: missing 'override' or 'new'
{
return x * y;
}
}
コンパイラは次のエラーを表示します: 現在のメンバーでその実装をオーバーライドするには、override キーワードを追加します。それ以外の場合は、新しいキーワードを追加します
サンプル 2:
class ShapesClass
{
virtual public int Area() { return 0; } // it is virtual now!
}
class Square : ShapesClass
{
int x, y;
public int Area() // no explicit 'override' or 'new' required
{
return x * y;
}
}
デフォルトでメソッドを非表示にすることで、これは正常にコンパイルされます。
技術的な違いを完全に理解しています。しかし、なぜ言語がそのように設計されたのか疑問に思います。「サンプル2」も同様の制限を設けたほうがよいのではないでしょうか?つまり、ほとんどの場合、親クラスと同じ名前のメソッドを作成すると、通常はそれをオーバーライドしようとします。したがって、Override/New を明示的に指定することは、仮想メソッドでも意味があると思います。
この動作に設計上の理由はありますか?
更新: 2 番目のサンプルでは実際に警告が発生します。最初のサンプルは、抽象メソッドを実装するためにサブクラスが必要であるため、エラーを示しています。VSで警告が表示されませんでした..今では完全に理にかなっています。ありがとう。