title: C# design: Why is new/override required on abstract methods but not on virtual methods?
body: <p>Why is new/override required on abstract methods but not on virtual methods?</p>
  
  <p>Sample 1:</p>
  
  <pre><code>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;
      }
  }
  </code></pre>
  
  <p>The compiler will show this error: 
  <em>To make the current member override that implementation, add the override keyword. Otherwise add the new keyword</em></p>
  
  <p>Sample 2:</p>
  
  <pre><code>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;
      }
  }
  </code></pre>
  
  <p>This will compile fine, by hiding the method by default.</p>
  
  <p>I fully understand the technical differences. However I wonder why the language was designed that way. Wouldn't it be better to have the same restriction in "Sample 2" as well? I mean in most cases if you create a method with the same name as in the parent class, you usually intent to override it. So I think explicitly stating Override/New would make sense on virtual methods as well.</p>
  
  <p>Is there a design-wise reason for this behavior?</p>
  
  <p><strong>Update:</strong>
  The 2nd sample actually causes a warning. The first sample shows an error because the subclass is required to implement the abstract method. I didn't see the warning in VS.. makes perfectly sense to me now. Thanks.</p>