J'ai du mal à comprendre comment Shadows
fonctionne 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):
c
est l'objet de la classe dérivée mais appelle la UseMe
méthode dans la classePerson
Me
mot-clé se comporte comme un objet faisant référence à une instance actuelle (ce qui dans ce cas est c
)Me.DoSomething = c.DoSomething
conséquent, le contrôle doit passer à la classe dérivéeDoSomething
dans la classe dérivée comme il l'a masqué DoSomething
dans 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 Shadows
empêche Me.DoSomething()
d'exécuter la DoSomething
méthode dans la classe dérivée et exécute à la place celle de la classe de base.
Shadows
est similaire à Overrides
sauf 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 Base
référence à un Base
objet, les deux méthodes invoquent l'implémentation de base. Pas de surprise là-bas. Lors de l'utilisation d'une Derived
référence à un Derived
objet, 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 Base
référence à un Derived
objet, 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 Me
dans la Person
classe. Me
est é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 Me
est 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
Déjame decir algunas palabras