我有一个基类和一个子类,它们都具有相同的属性,我不明白为什么 VB希望我对子类中的属性使用“Overloads”。不同之处在于属性的子类版本为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
中标记,并带有警告消息
属性'Species'阴影是在基础中声明的可重载成员 班级'家长'。如果要重载基本方法,请使用此方法 必须声明'Overloads'。
我想知道为什么它是否希望重载?当不同的参数被传递到具有相同名称的函数时,通常会使用重载,这些函数已被充分记录,但我没有发现任何解释为什么在这种情况下突然建议重载的原因。
注意:代码正确报告“Species1”,无论是否有“Overloads”或者没有增加我对它实际做什么的困惑......
答案 0 :(得分:3)
如果要重载基本方法,则必须将此方法声明为“Overloads”。
错误消息过于通用。请注意它是如何讨论方法的,即使警告是关于属性的。你不能超载一个属性。
如果我是法国国王,我会写错误信息:
属性'Species'隐藏从'Parent'基类继承的'Species'属性。如果要隐藏,请使用Shadows关键字来抑制此警告。如果不打算隐藏,请更改属性的名称。
这个警告几乎不应该被忽略,因为它几乎总能识别代码气味。使用Child.Species的共享关键字非常奇怪,几乎肯定不是你想要的。通过类型Parent的引用使用您的Child对象的任何代码将始终获取错误的种类名称,因为它将使用base属性。这里更明智的做法是声明Parent.Species属性 Overridable 并在Child.Species属性声明中使用 Overrides 关键字,而不使用Shared。
答案 1 :(得分: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