-2
votes

Pourquoi la classe de base = la nouvelle classe dérivée ne peut pas appeler la méthode de classe dérivée?

Nous avons deux classes A et B, B dérive d'un, J'ai créé a a = nouveau b (); 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 Il appelle la méthode d'une méthode non B?

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? < Pré> xxx


7 commentaires

Lisez à la réponse de General. Fondamentalement, lorsque vous créez SOMEMETHOD 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 et la version de sous-classe comme remplacer . Si vous souhaitez avoir la version de la sous-classe Remplacer la version de la classe de base (lorsqu'il est appelé via une référence de sous-classe), utilisez le mot-clé nouveau . Considérez si vous avez une classe de base appelée cow-boy et une méthode dessine (impliquant le dessin d'une arme à feu). Si votre sous-classe est cowboyartist , et que vous souhaitez la méthode draw pour utiliser un crayon, utilisez nouveau


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/... .


Ne pensez pas aux tas et les pointeurs. Dessinez plutôt une case de 1 pouce (ou 1 cm) carré, étiquetez-la A . Dessine maintenant une autre boîte de 1 pouce (/ cm) large, mais 2 haut. Étiquetez-le B (en bas). À l'intérieur de cette boîte, rincer avec le haut, dessinez une autre boîte 1x1. Étiquetez-le A aussi. Votre première case représente un A créé comme ceci var a = nouveau A (); . La deuxième boîte est le résultat de var b = nouveau b (); . Il contient un A , mais est un B . Si vous dites var ainb = (a) b , vous référenciez maintenant que b objet, mais vous ne le voyez que comme un a ( c'est-à-dire la boîte intérieure qui est un a )


Il contient un complet A Je ne suis pas sûr d'utiliser cette terminologie avec un nouveau programmeur. Un mâle ne contient pas une personne. Ils sont sont une personne. L'utilisation de la langue de contient 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 pointe à une instance de B (mâle). Mais cela le traite comme une instance de A (personne). Donc, si vous utilisez Shading (comme vous êtes dans votre code), vous invoquerez des méthodes définies dans la classe A .


3 Réponses :


2
votes

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.

Avertissement du compilateur ( Niveau 2) CS0108

'Member1' Cache des membres hérités "Membre2". Utilisez le nouveau mot-clé si cacher était destiné.

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.

Si vous souhaitez le masquer, utilisez le mot-clé neuf

Toutefois, si vous souhaitez appeler, utilisez-le, utilisez virtuel et remplacer il ou simplement modifier le nom de la méthode afin de ne pas la masquer xxx


virtuel (référence C #)

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:

Remplacer (référence C #)

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.

Polymorphisme (Guide de programmation C #)


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?

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.

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)


2 commentaires

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.



0
votes

Vous devez spécifier que vous souhaitez remplacer une fonction virtuelle. Essayez ceci: xxx


2 commentaires

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 , l'objet est de type B .



0
votes

Pour accéder à d'autresmethod où il échoue actuellement, vous devez indiquer à votre A code> d'agir comme un B code>.

changer p>

(a as B).OtherMethod();


3 commentaires

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 est un lecteur de balle et B est un joueur de tennis. Lorsque vous dites à un B à "Be un joueur de balle", il oubliera momentanément qu'il sait servir une balle de tennis. Cast A comme une forme vraie, B , afin qu'il puisse servir la balle.