Quelle est la signification des deux mots clés les Ombres et les Remplacements? Ce qu'ils font et dans quel contexte est l'un ou l'autre-elle préférable?
Réponses
Trop de publicités?Remplace est le plus normal de la qualification. Si l'enfant de la classe redéfinit une classe de base de la fonction de cette façon, alors peu importe la façon dont un enfant de l'objet référencé (à l'aide d'une classe de base, ou un enfant de la classe de référence), il est l'enfant de la fonction qui est appelée.
D'autre part, si l'enfant de fonction de classe Ombres de la classe de base de la fonction, puis un objet enfant accessible via une base de référence de classe utilisera la classe de base de la fonction, en dépit d'être un enfant de l'objet.
L'enfant définition de fonction n'est utilisée que si l'enfant objet est accessible à l'aide d'un correspondant de référence de l'enfant.
L'ombrage n'a probablement pas ce que vous pensez que cela fonctionne.
Considérer les classes suivantes:
Public MustInherit Class A
Public Function fX() As Integer
Return 0
End Function
End Class
Public Class B
Inherits A
Public Shadows Function fX() As Integer
Return 1
End Function
End Class
Maintenant, j'utilise:
Dim oA As A
Dim oB As New B
oA = oB
Vous pensez probablement que oA et oB sont le même droit?
Nope.
l'arthrose.fx = 0 en oB.fx = 1
À mon humble avis, c'est très dangereux de comportement et c'est à peine mentionné dans les docs.
Si vous aviez utilisé remplacer, elles doivent être la même.
Donc, bien qu'il existe des utilisations légitimes pour les ombres, les chances sont que vous êtes en train de faire n'est pas l'un d'eux et il devrait être évité.
Remplace - d'Étendre ou de créer d'autres fonctionnalités pour une méthode.
Exemple: Ajouter ou de l'extension des fonctions de l'événement de Peinture d'une fenêtre.
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e) ' retain the base class functionality
'add code for extended functionality here
End Sub
Ombres - Redéfinit une méthode héritée et les forces de son utilisation pour toutes les classes instanciées avec ce type. En d'autres termes, la méthode n'est pas surchargé, mais redéfini et les méthodes de classe de base ne sont pas disponibles, forçant ainsi l'utilisation de la fonction déclarée dans la classe. Les ombres conserve ou conserve la définition de la méthode telle qu'elle n'est pas détruite si les méthodes de classe de base sont modifiés.
Exemple: la Force de tous les "B" des classes à utiliser, il est excentrique Ajouter la définition de telle sorte que si Une classe d'Ajouter des méthodes sont modifiés, il n'affecte pas le B de l'ajouter. (Masque l'ensemble de la classe de base "Ajouter". Ne sera pas en mesure d'appeler A. Add(x, y, z) à partir d'une instance de B.)
Public Class A
Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function
Public Function Add(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Integer
Return x + y + z
End Function
End Class
Public Class B
Inherits A
Public Shadows Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x - y
End Function
End Class
Parfois un petit exemple permet de comprendre la différence dans un moyen technique.
Sub Main()
Dim o As New ChildClass
Console.WriteLine(o.GetValOverride()) ' Prints 2
Console.WriteLine(o.GetValShadow()) ' Prints 2
Console.WriteLine(CType(o, ParentClass).GetValOverride()) ' Prints 2
Console.WriteLine(CType(o, ParentClass).GetValShadow()) ' Prints 1
Console.ReadLine()
End Sub
Class ParentClass
Public Overridable Function GetValOverride() As String
Return "1"
End Function
Public Function GetValShadow() As String
Return "1"
End Function
End Class
Class ChildClass
Inherits ParentClass
Public Overrides Function GetValOverride() As String
Return "2"
End Function
Public Shadows Function GetValShadow() As String
Return "2"
End Function
End Class