关于vb.net:“Overloads”如何在子类中工作?

How does “Overloads” work in a child class?

我有一个基类和一个子类,它们都有相同的属性,我不明白为什么VB要我对子类中的属性使用"overloads"。区别在于属性的子类版本是Shared,而父类基本上是用于结构的。属性如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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行中用警告消息标记。

property 'Species' shadows an overloadable member declared in the base
class 'Parent'. If you want to overload the base method, this method
must be declared 'Overloads'.

我想知道的是,为什么它希望这个过载?重载通常在将不同的参数传递到具有相同名称的函数时使用,这是有很好的文档记录的,但是我没有找到任何解释为什么在这种情况下突然建议重载的方法。

注意:代码正确地报告"species1",不管它是否有"overloads"或者不增加我对它实际做什么的困惑…


If you want to overload the base method, this method must be declared 'Overloads'.

错误消息太普通。注意它如何谈论方法,即使警告是关于属性的。不能重载属性。

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

Property 'Species' hides the 'Species' property inherited from the 'Parent' base class. Use the Shadows keyword to suppress this warning if hiding was intended. Change the name of the property if hiding was not intended.

此警告几乎不应被忽略,因为它几乎总是标识代码气味。为孩子使用共享关键字。物种是非常奇怪的,几乎肯定不是你想要的。通过parent类型的引用使用子对象的任何代码都将始终得到错误的物种名称,因为它将使用base属性。这里要做的更明智的事情是声明parent.species属性可重写,并在child.species属性声明中使用overrides关键字,而不共享。


如果对成员进行阴影处理,则基类在调用时仍将使用该成员的版本。例如,如果您的基类中的一个函数名为species,它仍然会得到值"should get species from a child"。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    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