【问题标题】:Is there an easier way to work with lists of base types有没有更简单的方法来处理基本类型列表
【发布时间】:2019-11-15 18:28:34
【问题描述】:

我有一个基类List(Of Person) 的列表,其中包含子类EmployeeManager 的变量

我想在列表中的每个人上调用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


【解决方案1】:

不确定您要查找的内容,但以下代码会获取您要查找的名称。我摆脱了 SetName subs 并在类的构造函数中设置了 name 属性。您可以创建一个参数化的构造函数来设置不同的名称。顺便说一句,在大多数情况下不需要调用语句。

Private Sub OPCode()
    Dim PersonList As New List(Of Person)
    PersonList.Add(New Employee)
    PersonList.Add(New Manager)

    For Each CurrentPerson In PersonList
        Debug.Print(CurrentPerson.Name)
    Next
End Sub

Class Employee
    Inherits Person
    Public EmployeeID As String
    Public Sub New()
        Name = "Employee Bob"
    End Sub
End Class

Class Manager
    Inherits Person
    Public ManagerID As String
    Public Sub New()
        Name = "Manager Tom"
    End Sub
End Class

Class Person
    Public Name As String
    Public Sub New()
        Name = "Person Jim"
    End Sub
End Class

使用您的 SetName subs 且没有参数化构造函数的代码...

Private Sub OPCode()
    Dim PersonList As New List(Of Person)
    Dim e As New Employee()
    SetName(e)
    PersonList.Add(e)
    Dim m As New Manager()
    SetName(m)
    PersonList.Add(m)

    For Each CurrentPerson In PersonList
        Debug.Print(CurrentPerson.Name)
    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

Class Employee
    Inherits Person
    Public EmployeeID As String
End Class

Class Manager
    Inherits Person
    Public ManagerID As String
End Class

Class Person
    Public Name As String
End Class

两个代码都产生...

Employee Bob
Manager Tom

在即时窗口中

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2014-01-18
    • 2022-11-19
    • 1970-01-01
    • 2019-12-16
    • 2023-03-07
    相关资源
    最近更新 更多