65 votes

'Ombres' vs. 'Remplace' dans VB.NET

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?

88voto

Nick Points 813

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.

21voto

dwidel Points 71

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

15voto

user50612 Points 1921

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

10voto

the_lotus Points 3385

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X