3

我有一个基类和一个子类,它们都具有相同的属性,我不明白为什么VB 要我对子类中的属性使用“重载”。不同之处在于属性的子类版本是Shared,而父类基本上是用于结构的。属性如下所示:

Public MustInherit Class Parent
    Public ReadOnly Property Species As String
        Get
            Return "Should get species from a child." 
        End Get
    End Property
End Class

Public Class Child
    Inherits Parent
    Public Shared ReadOnly Property Species As String
        Get
            Return "Species1"
        End Get
    End Property
End Class

Species在子类的行中被标记为Public Shared ReadOnly Property Species As String带有警告消息

属性“物种”隐藏在基类“父”中声明的可重载成员。如果要重载基方法,则必须将此方法声明为“Overloads”。

我想知道的是为什么它想要这个超载?当不同的参数被传递到具有相同名称的函数中时,通常会使用重载,这有据可查,但我没有找到任何解释为什么在这种情况下突然建议重载。

注意:代码正确报告“Species1”,无论是否有“过载”或没有增加我对它实际作用的混淆......

4

2 回答 2

3

如果你想重载基方法,这个方法必须声明为'Overloads'。

错误信息过于笼统。请注意它是如何谈论方法的,即使警告是关于属性的。您不能重载属性。

如果我是法国国王,我会这样写错误信息:

属性“物种”隐藏了从“父”基类继承的“物种”属性。如果打算隐藏,请使用 Shadows 关键字来禁止显示此警告。如果不打算隐藏,请更改属性的名称。

这个警告几乎不应该被忽略,因为它几乎总是识别代码气味。为 Child.Species使用Shared关键字非常奇怪,几乎可以肯定不是您想要的。任何通过 Parent 类型的引用使用 Child 对象的代码总是会得到错误的物种名称,因为它将使用 base 属性。这里更明智的做法是声明 Parent.Species 属性Overridable并在 Child.Species 属性声明中使用Overrides关键字,而不使用 Shared。

于 2013-07-03T16:23:08.927 回答
0

如果您隐藏成员 - 基类在调用时仍将使用它的成员版本。例如,如果您的基类中有一个名为 Species 的函数,它仍然会得到值“应该从孩子那里获取物种”。

在这种情况下,重载将导致基类中的函数使用子类的值。

为了让这一点更清楚......以下代码的消息框显示“原始值”,而不是“新值”

    Public Class Form1
        Dim X As New Child
        Dim Y = MsgBox(X.ShowMe)
    End Class

    Public Class Parent

        Public Function ShowMe() As String
            Return member
        End Function

        Public Property member As String = "Original value"

    End Class

    Public Class Child
        Inherits Parent

        Public Property member As String = "New value"

    End Class
于 2013-07-03T16:26:05.050 回答