0

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になりますが、1 番目は「Employee Bob」、2 番目Managerは「Manager Tom」にする必要があります

これが最もクリーンな方法ですか?これは私がそれを行うと考えることができる唯一の方法です。私の場合、2 つではなく約 20 の派生クラスがあるため、これは面倒です。

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 をいじる例を使用する必要があったかもしれません。もっと明確でなくてごめんなさい。

4

1 に答える 1