【发布时间】:2019-11-15 18:28:34
【问题描述】:
我有一个基类List(Of Person) 的列表,其中包含子类Employee 和Manager 的变量
我想在列表中的每个人上调用SetName,但 vb.net 没有选择最窄的重载 SetName 函数。有没有办法自动选择最窄的SetName 函数?这是我的示例代码
Module Example
Class Person
Public Name As String
End Class
Class Employee
Inherits Person
Public EmployeeID As String
End Class
Class Manager
Inherits Person
Public ManagerID As String
End Class
Sub Main()
Dim PersonList As New List(Of Person)
Call PersonList.Add(New Employee)
Call PersonList.Add(New Manager)
For Each CurrentPerson As Person In PersonList
Call SetName(CurrentPerson)
Next
End Sub
Public Sub SetName(AnyManager As Manager)
AnyManager.Name = "Manager Tom"
End Sub
Public Sub SetName(AnyEmployee As Employee)
AnyEmployee.Name = "Employee Bob"
End Sub
Public Sub SetName(AnyPerson As Person)
AnyPerson.Name = "Person Jim"
End Sub
End Module
列表中的每个人最终都是“Person Jim”,但我希望第一个 Employee 是“员工 Bob”,第二个 Manager 是“经理 Tom”
这是最干净的方法吗?这是我能想到的唯一方法。在我的情况下这会变得一团糟,因为我有大约 20 个派生类而不是 2 个。
For Each CurrentPerson As Person In PersonList
If TypeOf (CurrentPerson) Is Employee Then
Call SetName(CType(CurrentPerson, Employee))
ElseIf TypeOf (CurrentPerson) Is Manager Then
Call SetName(CType(CurrentPerson, Manager))
End If
Next
编辑:我想我没能更清楚地说明我的需求。 Setname 只是用来代替任何需要列表中的窄类型而不是基类的函数。实际名称并不重要。也许我应该使用一个函数实际上与员工 ID 和经理 ID 混淆的示例。抱歉没有更清楚。
【问题讨论】:
-
你可以使用多态而不是继承。
-
啊,这可能是我出错的地方。我认为继承是自动的多态性,因为它们都具有 Name 属性。我是否使用实现而不是继承?
-
仅仅为了“任何东西”而将“任何东西”添加到属性中是一个非常糟糕的主意,相反我会覆盖
ToString来做到这一点。 -
这可行,但如果您的实际使用与您的示例一样简单,请考虑使用@Aybe 的建议来覆盖
ToString。我没想到,但这是个好主意。 -
我的真实案例要复杂得多,但遵循相同的思路。我只想能够从我的
List(Of Person)传递变量,同时保留我添加到列表中的窄类型而不是基类类型。
标签: vb.net list generics narrowing