Le mot clé Me ne peut pas exécuter le sous-programme dans la classe dérivée en raison de Shadows

Sougata

J'ai du mal à comprendre comment Shadowsfonctionne une fois utilisé avec Me. Voici le code que j'ai écrit:

Module Module1
    Sub main()
        Dim c As New Customer()
        c.UseMe() 'See item 1 
        Console.WriteLine("----")
        c.DoSomething()
        Console.ReadLine()
    End Sub
End Module

Public Class Person
    Public Sub DoSomething()
        Console.WriteLine("Person")
    End Sub

    Public Sub UseMe()
        Me.DoSomething() 'See item 2
        'See item 3
    End Sub
End Class

Public Class Customer
    Inherits Person

    Public Shadows Sub DoSomething()
        'See item 4
        Console.WriteLine("Customer")
    End Sub
End Class

Voici comment je m'attends à ce que cela fonctionne (mais ce n'est pas le cas):

  1. cest l'objet de la classe dérivée mais appelle la UseMeméthode dans la classePerson
  2. Le Memot-clé se comporte comme un objet faisant référence à une instance actuelle (ce qui dans ce cas est c)
  3. Par Me.DoSomething = c.DoSomethingconséquent, le contrôle doit passer à la classe dérivée
  4. Une fois que le contrôle est déplacé vers la classe dérivée, le compilateur doit exécuter le DoSomethingdans la classe dérivée comme il l'a masqué DoSomethingdans la classe de base. Par conséquent, la sortie doit être "Client" . Mais le résultat est "Personne"

Pouvez-vous s'il vous plaît expliquer où ma compréhension ne va pas? Je me demande pourquoi Shadowsempêche Me.DoSomething()d'exécuter la DoSomethingméthode dans la classe dérivée et exécute à la place celle de la classe de base.

jmcilhinney

Shadowsest similaire à Overridessauf que le premier travaille toujours sur le type de la référence tandis que le second travaille toujours sur le type de l'objet. Considérez le code suivant:

Module Module1

    Sub Main()
        Dim b1 As New Base
        Dim d As New Derived
        Dim b2 As Base = DirectCast(d, Base)

        b1.OverrideTest()
        b1.ShadowTest()
        d.OverrideTest()
        d.ShadowTest()
        b2.OverrideTest()
        b2.ShadowTest()

        Console.ReadLine()
    End Sub

End Module


Public Class Base

    Public Overridable Sub OverrideTest()
        Console.WriteLine("Base.OverrideTest")
    End Sub

    Public Sub ShadowTest()
        Console.WriteLine("Base.ShadowTest")
    End Sub

End Class


Public Class Derived
    Inherits Base

    Public Overrides Sub OverrideTest()
        Console.WriteLine("Derived.OverrideTest")
    End Sub

    Public Shadows Sub ShadowTest()
        Console.WriteLine("Derived.ShadowTest")
    End Sub

End Class

La sortie de ce code est la suivante:

Base.OverrideTest 
Base.ShadowTest 
Derived.OverrideTest 
Derived.ShadowTest 
Derived.OverrideTest 
Base.ShadowTest

Ainsi, lors de l'utilisation d'une Baseréférence à un Baseobjet, les deux méthodes invoquent l'implémentation de base. Pas de surprise là-bas. Lors de l'utilisation d'une Derivedréférence à un Derivedobjet, les deux méthodes invoquent l'implémentation dérivée. Pas de surprise là non plus. En revanche, lors de l'utilisation d'une Baseréférence à un Derivedobjet, la méthode surchargée invoque l'implémentation dérivée, c'est à dire travaille sur le type de l'objet, tandis que la méthode shadow invoque l'implémentation de base, c'est-à-dire travaille sur le type de la référence.

Dans votre code, vous utilisez Medans la Personclasse. Meest évidemment une référence à l'objet courant mais il ne peut s'agir que d'une référence du type courant, c'est-à-dire du type dans lequel se trouve réellement le code. Votre code utilisant Meest dans le type de base donc il appellera toujours les implémentations de base des membres masqués.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

la nouvelle propriété ne peut pas être instanciée dans le constructeur de classe dérivée

pl / sql Erreur de curseur ORA-06550 ORA-00905 Le curseur ne se compilera pas en raison d'un mot clé manquant. Je ne sais pas vraiment quel mot clé il me manque

Le sous-processus de Python ne peut pas exécuter le script dans un emplacement réseau sous Windows

où le mot clé auto ne peut pas déterminer le type en C ++

"ne peut pas déduire une durée de vie appropriée pour le modèle en raison d'exigences contradictoires" dans le modèle `ref mut`

la classe dérivée ne peut pas surcharger le membre privé de la classe de base avec celui d'une autre classe de base

Pourquoi utiliser le mot clé 'struct' dans la déclaration de pointeur de classe en C ++

le constructeur de la classe dérivée ne peut pas être constexpr si la classe de base contient un membre du tableau

Le sous-tableau renvoyé par la fonction ne peut parfois pas être utilisé en raison de la "valeur de type null"

La méthode de classe génère un message de chaîne, le test unitaire ne peut pas être effectué en raison d'une erreur citant la conversion de void en chaîne non applicable

Une raison de ne pas exécuter dans le script shell?

Laravel ne peut pas définir la variable de classe dans le constructeur

utilisation-déclaration dans une classe dérivée ne cache pas la même fonction dérivée de la classe de base

android studio ne construit pas ne peut pas exécuter le programme

La requête mysql node.js ne peut pas s'exécuter en raison de guillemets autour du chiffre

le mot-clé ne peut pas être une expression?

Le mot clé Python ne peut pas être une expression

Le cas de test Django ne peut pas exécuter la méthode

Comment exécuter des tests NUnit dans une classe en parallèle, mais pas avec d'autres tests de classe?

Le sous-processus Python ne peut pas capturer la sortie du programme Windows

Le modèle de sous-titrage d'image Keras ne se compile pas en raison de la concaténation du calque lorsque mask_zero = True dans un calque précédent

Le système ne peut pas trouver le fichier spécifié lors de l'exécution de la commande via le module Process en C #

rencontré une ERREUR qui ne peut pas exécuter le programme sur pyspark

Problème de pagination jsp lorsque je passe à la page suivante, le mot clé de recherche ne s'applique pas

L'erreur de champ Django ne peut pas résoudre le mot clé 'is_staff

CloudFormation ne parvient pas à trouver le groupe de sous-réseaux RDS en raison de la minuscule

Le thread ne peut pas s'exécuter à nouveau dans la boucle while après le redémarrage

Le modèle Spring JDBC ne peut pas exécuter les requêtes contenant une requête imbriquée dans la clause FROM

ffmpeg, le manifeste de tiret ne peut pas être créé en raison d'un format de pixel non spécifié