85 votes

Pourquoi avons-nous besoin d'un nouveau mot-clé et pourquoi est le comportement par défaut de cacher et de ne pas substituer?

Je regardais ce blog et avaient questions suivantes:

  • Pourquoi avons-nous besoin de l' new mot-clé, c'est juste de préciser qu'une méthode de classe de base est caché. Je veux dire, pourquoi avons-nous besoin? Si nous n'utilisons pas l' override mot-clé, ne sommes-nous pas cacher la méthode de classe de base?
  • Pourquoi est par défaut en C# à se cacher et à ne pas substituer? Pourquoi les concepteurs de mise en œuvre de cette façon?

136voto

Eric Lippert Points 300275

Les bonnes questions. Permettez-moi de re-état.

Pourquoi est-il légal pour masquer une méthode avec une autre méthode?

Permettez-moi de répondre à cette question avec un exemple. Vous disposez d'une interface de CLR v1:

interface IEnumerable
{
    IEnumerator GetEnumerator();
}

Super. Maintenant, dans le CLR v2 vous avez des génériques et vous pensez que "l'homme, si seulement nous avions eu des génériques en v1, j'aurais fait une interface générique. Mais je n'ai pas. Je dois faire quelque chose de compatible avec elle maintenant qui est générique en sorte que je reçois les avantages des médicaments génériques sans perdre la compatibilité avec le code qui attend IEnumerable."

interface IEnumerable<T> : IEnumerable
{
    IEnumerator<T> .... uh oh

Qu'allez-vous appeler la méthode GetEnumerator de IEnumerable<T>? Rappelez-vous, vous voulez de lui cacher GetEnumerator sur la non-générique de base de l'interface. Vous jamais voulez que chose d'être appelé, sauf si vous avez explicitement dans une arrière-compat situation.

Qui à lui seul justifie la méthode de masquage. Pour plus d'idées sur la justification de la méthode de masquage voir mon article sur le sujet.

Pourquoi se cacher sans aucun "nouveau" provoquer un avertissement?

Parce que nous voulons porter à votre attention que vous cachez quelque chose et peut-être le faire accidentellement. Rappelez-vous, vous pourriez être en train de cacher quelque chose accidentellement à cause d'une modification de la classe de base fait par quelqu'un d'autre, plutôt que par vous de l'édition de votre classe dérivée.

Pourquoi se cache sans "nouvelle" un avertissement plutôt qu'une erreur?

Même raison. Vous pourriez être en train de cacher quelque chose accidentellement parce que vous avez juste pris une nouvelle version d'une classe de base. Cela arrive tout le temps. FooCorp fait une classe de base B. BarCorp fait une classe dérivée d'une méthode de Barre, parce que leurs clients comme cette méthode. FooCorp le voit et dit hey, c'est une bonne idée, nous pouvons mettre cette fonctionnalité sur la classe de base. Ils le font et l'expédition d'une nouvelle version de Foo.DLL et quand BarCorp ramasse la nouvelle version, ce serait bien si ils ont dit que leur méthode de cache maintenant la méthode de classe de base.

Nous voulons que la situation à un avertissement et non une erreur parce que faire une erreur signifie que c'est une autre forme de l'fragile de la classe de base problème. C# a été soigneusement conçu de sorte que lorsque quelqu'un effectue un changement d'une classe de base, les effets sur le code qui utilise un dérivé de la classe sont réduits au minimum.

Pourquoi se cache et ne prévalent pas par défaut?

Parce que virtuel remplacement est dangereux. Virtuel permet de remplacer les classes dérivées à modifier le comportement de code qui a été compilé pour utiliser les classes de base. Faire quelque chose de dangereux, comme faire un remplacement doit être quelque chose que vous faites consciemment et délibérément, et non par accident.

16voto

Incognito Points 10148

Si la méthode dans la classe dérivée est précédé du mot-clé new, la méthode est définie comme étant indépendants de la méthode dans la classe de base

Toutefois, si vous ne spécifiez pas de nouveaux ou les remplacements, le résultat est le même que si vous avez spécifié nouveau, mais vous obtiendrez un avertissement du compilateur (comme vous pouvez ne pas être conscient que vous êtes en cachette une méthode dans la méthode de classe de base, ou vous avez peut-être voulu le remplacer, et simplement oublié d'inclure le mot-clé).

Donc il vous aide à éviter les erreurs et montrent explicitement ce que vous voulez faire et il rend le code plus lisible, donc, on peut facilement comprendre votre code.

14voto

Henk Holterman Points 153608

Il est intéressant de noter que le seul effet de l' new dans ce contexte est de supprimer un Avertissement. Il n'y a pas de changement dans la sémantique.

Donc la réponse est: Nous avons besoin d' new signaler au compilateur que la cachette est intentionnelle et à se débarrasser de l'avertissement.

Le suivi de la question est la suivante: Si vous ne pouvez pas / ne pouvez pas remplacer une méthode, pourquoi voulez-vous introduire une autre méthode avec le même nom? Parce que le masquage est, par essence, un nom-conflit. Et bien entendu, vous l'éviter dans la plupart des cas.

La seule bonne raison que je pense intentionnelle cacher, c'est quand un nom est imposé par une interface.

7voto

Darin Dimitrov Points 528142

En C# les membres sont scellés par défaut, ce qui signifie que vous ne pouvez pas les remplacer (à moins d'être marqué avec l' virtual ou abstract mots-clés) et ce pour des raisons de performances. Le nouveau modificateur est utilisée de manière explicite pour cacher un membre hérité.

2voto

Si une substitution de a par défaut, sans préciser le override mot-clé, vous pourriez accidentellement remplacer certains de la méthode de votre base juste en raison du nom de l'égalité.

.Net compilateur stratégie consiste à émettre des avertissements si quelque chose peut aller mal, juste pour être sûr, dans ce cas, si une substitution de a par défaut, il devrait être un avertissement pour chaque surchargée de la méthode de quelque chose comme un "avertissement: vérifier si vous avez vraiment envie de remplacement".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X