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