Conception C #: Pourquoi le nouveau / override est-il requis sur les méthodes abstraites mais pas sur les méthodes virtuelles?

Pourquoi est-nouveau/remplacer nécessaires sur les méthodes abstraites, mais pas sur les méthodes virtuelles?

Exemple 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;
    }
}

Le compilateur affiche cette erreur:
Pour rendre le membre actuel ignorer que la mise en œuvre, ajoutez le mot-clé override. Sinon, ajouter un nouveau mot-clé

Exemple 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;
    }
}

Cela permettra de compiler fine, en se cachant la méthode par défaut.

Je comprends pleinement les différences techniques. Cependant je me demande pourquoi le langage a été conçu de cette façon. Ne serait-il pas mieux d'avoir la même restriction en "Exemple 2"? Je veux dire que dans la plupart des cas, si vous créez une méthode avec le même nom que dans la classe parent, vous avez généralement l'intention de le remplacer. Je pense donc qu'en indiquant expressément Override/Nouvelle aurait du sens sur des méthodes virtuelles.

Est là une conception-sage raison de ce comportement?

Mise à jour:
Le 2ème échantillon provoque un avertissement. Le premier exemple montre une erreur, car le sous-classe est nécessaire pour mettre en œuvre la méthode abstraite. Je n'ai pas vu l'avertissement de VS.. fait parfaitement sens pour moi maintenant. Merci.

source d'informationauteur driAn