2009-10-03 6 views
1

En supposant un type de base de "Message" ...Liste VB.NET (Of T) - Puis-je l'utiliser pour contenir des éléments de plusieurs types?

Public Class Message 
    Public ID As Int64 
    Public Text As String 
    Public MessageType as String 
End Class 

... puis deux classes dérivées ...

Public Class PhoneMessage 
    Inherits Message 
    Public MessageLength As Int64 
End Class 

Public Class MailMessage 
    Inherits Message 
    Public Postage As Int64 
End Class 

Je voudrais avoir une collection d'objets de message qui peut être soit PhoneMessages ou MailMessages, de sorte que je peux itérer dans la liste et traiter chaque message en fonction de quel type il se trouve être.

La tentative d'utilisation de .Add() échoue, indiquant que je ne peux pas ajouter un élément de type PhoneMessage à une liste (Of Message). Y a-t-il une manière élégante d'accomplir ce que j'essaye de faire? J'avais pensé que je pourrais accomplir cela avec des génériques, mais je pense qu'il y a une lacune dans ma compréhension. Si cela peut être accompli dans .NET 2.0, ce serait idéal.

Merci d'avance.

+0

Veuillez nous montrer le code qui crée la liste et essaie d'y ajouter. – RBarryYoung

Répondre

2

La façon dont vous décrivez la façon dont vous ajoutez les éléments à la liste devrait fonctionner. Peut-être qu'il manque quelque chose à votre code? Avec le code que vous avez donné à vos cours, cela devrait faire l'affaire:

Dim phoneMessage As New PhoneMessage() 
    Dim mailMessage As New MailMessage() 

    Dim messageList As New List(Of Message)() 

    messageList.Add(phoneMessage) 
    messageList.Add(mailMessage) 
+0

Je vois ma folie maintenant. Je créais une liste (Of PhoneMessage) et essayait d'ajouter cette liste à une liste (Of Message) avec .AddRange(). Maintenant, je vois la bonne approche. Merci, StackOverflow! – DWRoelands

0

Bizarre, ça devrait vraiment marcher. Avez-vous essayé d'utiliser CType() ou DirectCast pour le convertir en message?

1

Vous avez juste besoin de jeter PhoneMessage à sa classe de base message

0

est ici un code qui prouve que scottman666 est correct:

Public Class InheritanceTest 
    Public Class Message 
     Public ID As Int64 
     Public Text As String 
     Public MessageType As String 
    End Class 

    Public Class PhoneMessage 
     Inherits Message 
     Public MessageLength As Int64 

    End Class 

    Public Class MailMessage 
     Inherits Message 
     Public Postage As Int64 
    End Class 

    Public Shared Sub ListTest() 
     Dim lst As New List(Of Message) 
     Dim msg As Message 

     msg = New PhoneMessage() 

     lst.Add(msg) 
     lst.Add(New MailMessage()) 
    End Sub 
End Class 

Je vous recommandons de procéder à l'utilisation des fonctions Overidable et MustOveride faire des objets polymorphes. Il y a un bon moyen de gérer le modèle de conception avec lequel vous travaillez.

+0

Il se peut qu'il ait l'option strict ou l'option explicitement activée. –

Questions connexes