2010-10-28 7 views
2

Je veux savoir si je ne mets pas override mot-clé avant la méthode dans la méthode de classe dérivée m1(), alors quelle est la valeur par défaut avant cela, ou va-t-il lancer une erreur de compilation?C# override mot-clé

class A { virtual void m1(){} } 
class B: A { void m1(){} } 
+3

Lorsque vous avez compilé ce code, que Visual Studio a-t-il produit? –

Répondre

8

D'abord, vous obtiendrez une erreur de compilation parce que virtual membres ne peuvent pas être privés qui A.m1 est aussi écrit. Deuxièmement, une fois que vous corrigez cela, vous recevrez un avertissement à la compilation indiquant que le B.m1 cache le membre hérité A.m1.

Troisièmement, si vous faites quelque chose comme ceci:

A a = new B(); 
a.m1(); 

Cela invoquera A.m1 alors que si vous insérez override dans la définition de B.m1 alors ce qui précède invoquer B.m1. Cependant, si vous insérez new dans la définition de B.m1, alors ce qui précède appellera toujours A.m1 mais il omettra l'avertissement de compilation.

+0

il se cachera signifie que la méthode de la classe de base ne sera pas héritée de la classe dérivée. Si j'utilise le nouveau kew alors le gain masquera la méthode de la classe de base. et si oui, quelle est la différence entre utiliser le mot clé KEY et ne pas utiliser le mot clé KEY – NoviceToDotNet

+0

Par "KEY" vouliez-vous dire "nouveau"? La différence est qu'il va se débarrasser de l'avertissement à la compilation. L'avertissement est là pour vous dire, "Hé, vouliez-vous remplacer ou cacher le membre hérité? Je vais supposer que vous vouliez cacher, mais vous devriez vous pencher sur cela." Le 'nouveau' est de dire au compilateur," oui, je voulais cacher le membre hérité. " Alors oui, le comportement est le même, mais l'avertissement sert un but réel. C# est prudent pour vous empêcher de vous tirer dans le pied. – jason

+1

Si vous voulez le cacher, utilisez "new" pour indiquer que vous voulez vraiment le cacher et ne pas le remplacer. La seule nouveauté consiste à supprimer l'avertissement du compilateur. – CodesInChaos

1

Lorsque vous compilez, il vous avertira que B.m1() cache le membre hérité A.m1().

Vous devez utiliser le nouveau mot-clé si vous souhaitez rompre la chaîne d'héritage ou utiliser override pour obtenir votre comportement virtuel.

2

Sans le override le compilateur émet un avertissement, autant que je me souvienne. Dans ce cas, la méthode est traitée comme si elle avait le modificateur new.