Différence entre les nouveaux et les remplacer
Vous vous demandez quelle est la différence entre la suivante:
Cas 1: La Classe De Base
public void DoIt();
Cas 1: classe Héritée
public new void DoIt();
Cas 2: La Classe De Base
public virtual void DoIt();
Cas 2: classe Héritée
public override void DoIt();
Les deux cas 1 et 2 semblent avoir le même effet sur la base des essais, j'ai couru. Est-il une différence, ou d'une manière préférée?
Double de nombreuses questions, y compris stackoverflow.com/questions/159978/...
OriginalL'auteur Shiraz Bhaiji | 2009-09-09
Vous devez vous connecter pour publier un commentaire.
appellera
Derived.DoIt
si qui remplaceBase.DoIt
.Sera d'abord appel
Base.DoIt
, puisDerived.DoIt
. Ils sont en fait deux méthodes distinctes qui se trouvent avoir le même nom, plutôt que la dérivée de la méthode de substitution de la méthode de base.Source: Microsoft blog
This indicates for the compiler to use the last defined implementation of a method
. comment pouvez trouver les dernières défini la mise en œuvre d'une méthode??Démarrer à partir d'un béton de classe, vérifier si il a une implémentation de la méthode de l'intérêt. Si elle fonctionne, vous avez terminé. Si cela ne fonctionne pas, passer à une étape dans la hiérarchie d'héritage, c'est à dire, vérifier si la super-classe est la méthode de d'intérêt. Continuer jusqu'à ce que vous avez trouvé la méthode de l'intérêt.
Notez également que vous ne pouvez
override
une méthode de la classe de base définit la méthode commevirtual
. Le motvirtual
est la classe de base en disant: "Hé, quand j'appelle cette méthode, il aurait presque été remplacé par un dérivé de la mise en œuvre, donc je ne pas vraiment savoir à l'avance ce que la méthode de la mise en œuvre, je suis tout à fait d'appel au moment de l'exécution. Doncvirtual
signifie est un espace réservé pour une méthode. Cela implique que les méthodes qui ne sont pas marqués commevirtual
peut pas être modifiée. Mais vous pouvez remplacer tous les non-méthode virtuelle dans une classe dérivée avec le modificateurnew
, accessible uniquement à dérivée niveau.OriginalL'auteur rahul
virtuel: indique qu'une méthode peut être remplacé par un héritier de
remplacer: remplace la fonctionnalité d'une méthode virtuelle dans une classe de base, fournissant des fonctionnalités différentes.
nouveau: cache la méthode originale (qui n'ont pas à être virtuel), offrant des fonctionnalités différentes. Cela ne devrait être utilisé que lorsqu'il est absolument nécessaire.
Lorsque vous masquez une méthode, vous pouvez toujours accéder à la méthode originale par la coulée de la classe de base. C'est utile dans certains scénarios, mais dangereux.
un appelant peut ne pas être au courant de la mise en œuvre, provoquant une mauvaise utilisation accidentelle.
OriginalL'auteur Jon B
Dans le premier cas, vous vous cachez la définition de la classe parent. Cela signifie qu'il ne sera invoquée lorsque vous traitez avec l'objet que l'enfant de la classe. Si vous lancez la classe de son type parent, le parent de la méthode sera invoquée. Dans le second cas, la méthode est substituée et sera invoqué indépendamment de savoir si l'objet est en fonte que l'enfant ou le parent de la classe.
OriginalL'auteur tvanfosson
essayer suivantes: (décision1)
Edit: virtuel+remplacer sont résolus au moment de l'exécution (afin de remplacer vraiment remplace les méthodes virtuelles), tandis que de nouvelles il suffit de créer la nouvelle méthode avec le même nom, et se cache le vieux, il est résolu au moment de la compilation -> votre compilateur va appeler la méthode qu'il "voit"
OriginalL'auteur nothrow
Dans le cas 1, si vous avez utilisé l'appel DoIt() la méthode de la classe héritée alors que le type est déclaré comme étant de la classe de base vous permettra de voir l'action de la classe de base même.
Tout ceci doit être collé à l'intérieur de votre point d'entrée de la classe (Programme). Qui a été supprimé afin de permettre une meilleure mise en forme sur ce site.
OriginalL'auteur Matthew Whited
La différence entre les deux cas est que dans le cas 1, la base
DoIt
méthode ne permet pas d'obtenir remplacé, il suffit de caché. Ce que cela signifie, c'est que selon le type de la variable dépend de la méthode qui sera appelée. Par exemple:Cela peut être vraiment déroutant et des résultats non attendus comportement et doit être évitée si possible. De sorte que le moyen préféré serait le cas 2.
OriginalL'auteur Shannon Cornish
Ma façon de garder à l'esprit les mots-clés qu'ils sont à l'opposé les uns des autres.
override
:virtual
mot-clé doit être défini pour remplacer la méthode. La méthode à l'aide deoverride
mot-clé que quel que soit le type de référence(référence de base de la classe ou de la classe dérivée) si il est instancié avec la classe de base, la méthode de classe de base s'exécute. Sinon, la méthode de la classe dérivée s'exécute.new
: si le mot clé est utilisé par une méthode, à la différence deoverride
mot-clé, le type de référence est important. Si il est instancié avec la classe dérivée et le type de référence est la classe de base, la méthode de classe de base s'exécute. Si il est instancié avec la classe dérivée et le type de référence est dérivée de la classe, la méthode de la classe dérivée s'exécute. À savoir, c'est le contraste deoverride
mot-clé. En passant, si vous oublier ou omettre d'ajouter un nouveau mot-clé de la méthode, le compilateur se comporte par défaut commenew
mot-clé est utilisé.Appel principal:
De sortie:
Comme une note, je n'ai pas touché au C++ pour 3 ans et pourtant je crois que la façon dont je l'expliquer, c'est toujours utile pour vous.
OriginalL'auteur snr
Si le mot-clé
override
est utilisé dans dériver de la classe puis son substituer la méthode parent.Si le mot-Clé
new
est utilisé dans dériver de la classe puis tirer méthode cachée par la méthode parent.OriginalL'auteur saba
L'article ci-dessous est en vb.net mais je pense que l'explication sur le nouveau vs remplace est très facile à saisir.
https://www.codeproject.com/articles/17477/the-dark-shadow-of-overrides
À un certain point dans l'article, il y a cette phrase:
Accepté la réponse à cette question est parfait, mais je pense que cet article vous fournir de bons exemples pour ajouter le meilleur sens sur les différences entre ces deux mots-clés.
OriginalL'auteur Samuel
De tous ceux, nouveau est le plus déroutant. Par le biais de l'expérimentation, un nouveau mot-clé est comme donner aux développeurs la possibilité de remplacer la classe qui hérite de la mise en œuvre avec la classe de base de la mise en œuvre explicitement à la définition du type. C'est comme penser l'inverse.
Dans l'exemple ci-dessous, le résultat sera de retour "Dérivé de suite" jusqu'à ce que le type est explicitement défini comme BaseClass test, alors seulement "de Base" résultat sera retourné.
OriginalL'auteur usefulBee
De la différence fonctionnelle ne sera pas montrer dans ces tests:
Dans ce exmample, le Faire, qui est appelé est celui que vous attendre à être appelé.
Afin de voir la différence que vous avez à faire cela:
Vous de voir si vous exécutez le test que dans le cas 1 (que vous avez défini), la
DoIt()
dansBaseClass
est appelé, dans le cas 2 (que vous avez défini), laDoIt()
dansDerivedClass
est appelé.OriginalL'auteur Ken Falk
J'ai eu la même question et c'est vraiment déroutant,
vous devriez considérer que remplacer et nouveau mots-clés à travailler uniquement avec des objets de type classe de base et la valeur de la dérivée de la classe. Dans ce cas uniquement, vous verrez l'effet de remplacement et de nouveau:
Donc, si vous avez
class A
etB
,B
hérite deA
, alors vous instanciez un objet comme ceci:Maintenant sur l'appel de méthodes prendra son état en considération.
Remplacer: signifie qu'il étend la fonction de la méthode, il utilise alors la méthode dans la classe dérivée, alors que nouveau dire au compilateur pour masquer la méthode dans la classe dérivée et de l'utilisation de la méthode dans la classe de base à la place.
Voici une très bonne vue à ce sujet:
https://msdn.microsoft.com/EN-US/library/ms173153%28v=VS.140,d=hv.2%29.aspx?f=255&MSPPError=-2147217396
OriginalL'auteur
Dans le premier cas, il fera appel de la classe dérivée DoIt() méthode car le nouveau mot-clé masque de la classe de base DoIt() méthode.
Dans le deuxième cas, il s'appel bien sûr DoIt()
laissez créer des instances de ces classes
Tout ce qui est prévu ci-dessus. Laissez instanceB et instanceC à instanceA et appel DoIt() la méthode et vérifier le résultat.
OriginalL'auteur cimey