Nous avons deux classes A et B, B dérive d'un,
J'ai créé dans le tas dans cette situation lors de la création d'une instance d'objet, tapez le pointeur d'objet pointeur sur A ou B? P> < Pré> xxx pré> p> a a = nouveau b (); code>
Pourquoi dans mon code lorsque j'appelle la méthode de B qui ne contient pas d'erreur, je reçois une erreur.
Cela signifie-t-il que le pointeur d'objet de type est de type A? et deuxièmement, quand j'appelle
SOMEMETHOD CODE> Il appelle la méthode d'une méthode non B?
3 Réponses :
Parce que vous manquez l'avertissement flagrant dans l'IDE
Code de sévérité Description Dépression du fichier de projet État de suppression de la ligne AVERTISSEMENT CS0108 'B.Somemethod ()' Membre hérité 'A.Somemethod ()'. Utilisez le nouveau mot-clé si la cachette était destinée. P> blockQuote>
Avertissement du compilateur ( Niveau 2) CS0108 P>
'Member1' Cache des membres hérités "Membre2". Utilisez le nouveau mot-clé si cacher était destiné. p>
Une variable a été déclarée avec le même nom qu'une variable dans une base classer. Cependant, le nouveau mot-clé n'a pas été utilisé. Cet avertissement vous informe que vous devriez utiliser de nouveau; la variable est déclarée comme si nouvelle avait été utilisé dans la déclaration. P> blockQuote>
Si vous souhaitez le masquer, utilisez le mot-clé
neuf p>
Toutefois, si vous souhaitez appeler, utilisez-le, utilisez code> virtuel code> et
remplacer code> il ou simplement modifier le nom de la méthode afin de ne pas la masquer p>
xxx pré>
Le mot clé virtuel est utilisé pour modifier une méthode, une propriété, une indexeur ou Déclaration d'événement et permettez-la d'être remplacée dans un dérivé classer. Par exemple, cette méthode peut être remplacée par n'importe quelle classe qui hérite de: p> blockQuote>
Le modificateur de remplacement est nécessaire pour étendre ou modifier le résumé ou mise en œuvre virtuelle d'une méthode héritée, d'une propriété, d'une indexeur ou événement. p> blockQuote>
Polymorphisme (Guide de programmation C #) P>
dans le tas dans cette situation lors de la création d'une instance d'objet, tapez Pointeur d'objet pointe sur A ou B? P> blockQuote>
Vous n'avez pas besoin de vous inquiéter de ce qui se passe sur le tas (ce sont des détails de la mise en œuvre), ce que la langue vous permet de faire. p>
Cependant, une techniquement n'existe pas, Il n'y a qu'une instance de B, qui a toute la mise en œuvre d'un (si vous en avez besoin) p> p>
Merci de répondre, mais je veux savoir ce qui se passe dans le tas et les détails de la mise en œuvre m'intéressent également. Je sais que chaque objet dans le tas a synchronisé l'index de bloc et le pointeur d'objet de type, la seconde a aidé à JIT pour déterminer la méthode à appeler. Où puis-je obtenir des détails sur la mise en œuvre de cette situation?
@LearnProgrammation: Lisez les spécifications C # et .NET. Je n'ai jamais lu le .Net One, mais la spécification C # est étonnamment assez lisible.
Vous devez spécifier que vous souhaitez remplacer une fonction virtuelle.
Essayez ceci:
Je sais que je devrais faire la méthode virtuelle, mais ma question est également à quel type de type pointeur d'objet pointé sur A ou B?
Si vous instanciez une variable de type B code>, l'objet est de type
B code>.
Pour accéder à d'autresmethod où il échoue actuellement, vous devez indiquer à votre changer p> A code> d'agir comme un
B code>.
(a as B).OtherMethod();
Quand j'ai créé un nouveau B (), quel est le pointeur de type d'objet dans le tas, il pointe de type B ou B?
Mais si c'est le type de B, pourquoi l'autremethod de B est inaccessible?
Imagine A code> est un lecteur de balle et
B code> est un joueur de tennis. Lorsque vous dites à un
B code> à "Be un joueur de balle", il oubliera momentanément qu'il sait servir une balle de tennis. Cast
A code> comme une forme vraie,
B code>, afin qu'il puisse servir la balle.
Lisez à la réponse de General. Fondamentalement, lorsque vous créez
SOMEMETHOD code> dans la classe de base et dans la sous-classe, vous avez le choix. Si vous voulez qu'ils soient liés, créez la version de la classe de base comme
virtuel code> et la version de sous-classe comme
remplacer code>. Si vous souhaitez avoir la version de la sous-classe Remplacer i> la version de la classe de base (lorsqu'il est appelé via une référence de sous-classe), utilisez le mot-clé
nouveau code>. Considérez si vous avez une classe de base appelée
cow-boy code> et une méthode
dessine code> (impliquant le dessin d'une arme à feu). Si votre sous-classe est code> cowboyartist code>, et que vous souhaitez la méthode code> draw code> pour utiliser un crayon, utilisez
nouveau code>
Dupliqué possible de différence entre l'observation et le remplacement de C #?
Votre question de tas semble un peu confus. Si vous instanciez une variable de type x, l'objet sur le tas est de type X. C'est vraiment si simple. En tant que question de côté - c'est aussi la raison pour laquelle vous ne devez pas demander qu'une seule question par post - meta.stackexchange.com/questions/222735/... . I>
Ne pensez pas aux tas et les pointeurs. Dessinez plutôt une case de 1 pouce (ou 1 cm) carré, étiquetez-la
A code>. Dessine maintenant une autre boîte de 1 pouce (/ cm) large, mais 2 haut. Étiquetez-le
B code> (en bas). À l'intérieur de cette boîte, rincer avec le haut, dessinez une autre boîte 1x1. Étiquetez-le
A code> aussi. Votre première case représente un
A code> créé comme ceci
var a = nouveau A (); code>. La deuxième boîte est le résultat de
var b = nouveau b (); code>. Il contient un
A code>, mais est un
B code>. Si vous dites
var ainb = (a) b code>, vous référenciez maintenant que
b code> objet, mais vous ne le voyez que comme un
a code> ( c'est-à-dire la boîte intérieure qui est un
a code>)
Il contient un complet A code> Je ne suis pas sûr d'utiliser cette terminologie avec un nouveau programmeur. Un mâle ne contient pas B> une personne. Ils sont sont b> une personne. L'utilisation de la langue de
contient code> permet d'avoir un moyen d'accéder à la personne en moi. Il n'y a pas.
Puis-je dire qu'un nouveau B (), c'est B dans un?
La variable
A code> pointe à une instance de
B code> (mâle). Mais cela le traite comme une instance de
A code> (personne). Donc, si vous utilisez Shading (comme vous êtes dans votre code), vous invoquerez des méthodes définies dans la classe
A code>.