【发布时间】:2010-07-15 14:02:48
【问题描述】:
我在 VB.Net 类库中有一个问题,我已将其大大简化为以下内容...
Public MustInherit Class TargetBase
End Class
Public Class TargetOne
Inherits TargetBase
End Class
Public Class TargetTwo
Inherits TargetBase
End Class
Public Class TargetManager
Public Sub UpdateTargets(ByVal Targets As List(Of TargetBase))
For Each objTarget As TargetBase In Targets
UpdateTarget(objTarget)
Next
End Sub
Private Sub UpdateTarget(ByVal Value As TargetOne)
End Sub
Private Sub UpdateTarget(ByVal Value As TargetTwo)
End Sub
End Class
由于UpdateTarget(objTarget) 行上的语法错误,这将无法编译 - 重载解析失败,因为在没有缩小转换的情况下无法调用可访问的“UpdateTarget”
所以我将 For-Each 循环更改为使用 Object 而不是 TargetBase...
For Each objTarget As Object In Targets
UpdateTarget(objTarget)
Next
现在可以编译,但出现运行时错误 - 未找到类型“TargetManager”的公共成员“UpdateTarget”。
所以我采取了明显的下一步,将 2 个 UpdateTarget() 重载设为公共(而不是私有)。
Public Sub UpdateTarget(ByVal Value As TargetOne)
End Sub
Public Sub UpdateTarget(ByVal Value As TargetTwo)
End Sub
现在可以了!
我几乎可以理解为什么将其更改为 Object 会起作用,但是当我仅在同一个类中调用它们时为什么必须将这些方法设为 Public - 我宁愿它们在此类之外不可用。
谁能解释一下?
提前致谢(抱歉这个问题太长了!)
附加 到目前为止,感谢大家的回答。我已经找到了使它工作的解决方法(使 UpdateTarget 方法公开)。另一种解决方法是在调用 UpdateTarget 之前对 objTarget 和 DirectCast 进行 TypeOf 检查,例如...
For Each objTarget As Object In Targets
If TypeOf objTarget Is TargetOne Then
UpdateTarget(DirectCast(objTarget, TargetOne))
ElseIf TypeOf objTarget Is TargetTwo Then
UpdateTarget(DirectCast(objTarget, TargetTwo))
End If
Next
这也可行 - 我发布了这个问题,因为我真的很想了解为什么将 UpdateTarget 的可见性从 Private 更改为 Public 会消除运行时错误,这完全违背了我的理解!
【问题讨论】:
-
您的意思是像这样构造您的 UpdateTarget 方法吗?您不是说在每个 TargetBase 子类中都有一个 UpdateTarget 方法吗?然后你可以调用objTarget.UpdateTarget。您之前可能遇到过这个编译错误,因为 .net 不知道它正在传递哪个类(缩小转换)
-
只是出于好奇“这现在有效”的意思——它调用了 TargetBase 类型的相关方法(即正确);还是它总是调用其中一种方法?
-
@Jugglingnutcase - 感谢您的回答。我已经考虑过这一点,不幸的是这是不可能的。我展示的代码示例非常简化(只是为了说明问题) - 在我的实际项目中,我无法访问 TargetBase,因此无法向其添加 UpdateTarget 方法。
-
@Adam:它的工作原理是调用了正确的 UpdateTarget 方法
-
出于更多好奇 - 如果您从私有更改为公共但保留 TargetBase 的原始传递,而不是强制转换为对象 - 它是否有效?
标签: .net inheritance oop