1

我知道有很多问题和其他网页解释了遮蔽和覆盖之间的区别。不幸的是,我仍然不明白我应该使用哪一个。

我的情况是这样的:我希望创建一个继承System.ComponentModel.BindingList特定类型的类,以进行诸如添加和删除线程安全之类的操作。

如果我的基础课如下:

Imports System.ComponentModel

Public Class DeviceUnderTestBindingList

Inherits System.ComponentModel.BindingList(Of DeviceUnderTest)

Private Sub New()
    MyBase.New()
End Sub

Public Sub Add(ByVal device As DeviceUnderTest)
    MyBase.Add(device)
End Sub

Public Sub Remove(ByVal deviceKey As UInteger)
    MyBase.Remove(deviceKey)
End Sub
End Class

我希望使用此类的人只能使用我提供的 .Add 和 .Remove 方法,而不是来自 BindingList 的方法。但我希望我的班级能够在内部访问 BindingList 方法,例如,您可以看到我的 .Add 方法当前在某些时候调用 BindingList.Add 方法。

我已经对两者进行了尝试,shadows并且overrides它们似乎都给出了相同的效果,所以在这种情况下,一个比另一个更正确,为什么?

4

2 回答 2

4

重载是一个完全不同的概念。从本质上讲,重载允许您拥有多个Add()andRemove()方法,同时覆盖方法“替换”原始行为。阴影介于两者之间。阴影“隐藏”了原始行为,但您仍然可以通过转换为基本类型来访问基本方法。

一般来说,如果你可以覆盖它,你就不会隐藏它。除非您有非常具体的理由这样做。

请注意,您不能同时覆盖和隐藏同一个成员。但是,例如,您可以覆盖和重载原始Add()方法。

编辑

您不能覆盖该Add()方法,但可以覆盖OnAddingNew(). 同样,您不能覆盖Remove(),但可以覆盖RemoveItem()。我不知道这个类的细节,但我怀疑它在幕后Remove()使用RemoveItem()

您的实现可能看起来像这样:

Imports System.ComponentModel
Imports System.Collections.ObjectModel

Public Class DeviceUnderTestBindingList
    Inherits BindingList(Of DeviceUnderTest)

    Private Sub New()
        MyBase.New()
    End Sub

#Region "Add()"

    Protected Overrides Sub OnAddingNew(e As AddingNewEventArgs)
        Dim newDevice As DeviceUnderTest = DirectCast(e.NewObject, DeviceUnderTest)

        Try
            If (Not IsValidEntry(newDevice)) Then ' don't add the device to the list
                Exit Sub
            End If

            ' (optionally) run additional code
            DoSomethingWith(newDevice)
        Finally
            MyBase.OnAddingNew(e)
        End Try
    End Sub

    Private Function IsValidEntry(device As DeviceUnderTest) As Boolean
        ' determine whether the specified device should be added to the list
        Return True Or False
    End Function

    Private Sub DoSomethingWith(newDevice As DeviceUnderTest)
        ' This is where you run additional code that you would otherwise put in the 'Add()' method.
        Throw New NotImplementedException
    End Sub

#End Region ' Add()

#Region "Remove()"

    Public Shadows Function Remove(device As DeviceUnderTest) As Boolean
        Try
            RemoveItem(IndexOf(device))
        Catch
            Return False
        End Try
        Return True
    End Function

    Protected Overrides Sub RemoveItem(index As Integer)
        MyBase.RemoveItem(index)
    End Sub

#End Region ' Remove()

End Class
于 2013-08-26T12:42:58.453 回答
1

看看这个问题和接受的答案。new它解释了 C# &关键字之间的区别override,即 AFAIK,与 VB.NEt shadows&的含义相同overrides

在您的情况下,我建议使用override. 更一般地说,只有在您确定为什么要这样做的情况下,您最好使用shadows(或在 C# 中)。new

如果您使用shadows关键字,用户将能够调用该方法的基类型版本——而不是您在类中定义的版本——以防他们通过基类型引用调用它。在overrides这两种情况下都将调用您的方法版本。

于 2013-08-26T11:19:51.403 回答