Страница: 1 |
Страница: 1 |
Вопрос: Рекурсивный обход через ForEach
Добавлено: 01.10.06 22:51
Автор вопроса: Neco | Web-сайт:
Есть такой каркас классов:
Public Index As Integer
Public Message As MailTemplate
Public MustInherit Class MailTemplate
End Class
Public Class MailText
Inherits MailTemplate
End Class
Public Class MailMultipart
Inherits MailTemplate
Public Parts() As MailTemplate
End Class
Public Class MailApplication
Inherits MailTemplate
End Class
Public Class MailMessage
Inherits MailTemplate
End Class
End Class
Класс MailMultipart может содержать в себе себеподобные экземпляры, что делает саму структуру неограниченной по вложенности.
Теперь я хочу, чтобы с экземпляром главного класса можно было работать так:
For Each attach As clsMailMsg.MailApplication In foo.Message
attach.SaveTo("c:\")
Next
Т.е. сохранить все прикрепления из этого письма в корень диска. Это было бы удобно, поскольку я не знаю заранее структуру приходящих писем, а мне надо выбирать из них только прикрепления.
Но такой код не работает - чувствую, что надо присобачить какой-нибудь Enumerator, но никогда с ними не работал и не понимаю принципа.
Как мне надо изменить структуру классов, чтобы код стал работать?
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 11.10.06 12:32
Для поддержки цикла вида For Each ... Next тебе необходимо реализовать в своем классе 2 интерфейса:
System.Collections.IEnumerator
Но (имхо) гораздо убнее наследовать любую из существующих коллекций (которая тебе подойдет) и приспособить ее для своих целей, поскольку они практически все уже поддерживают этот цикл..
Примерно так..
'// Тестовый класс
Public Sub New(ByVal Color As Color)
_Color = Color
End Sub
#Region " Public Property Color "
Private _Color As Color = Nothing
Public Property Color() As Color
Get
Return _Color
End Get
Set(ByVal value As Color)
_Color = value
End Set
End Property
#End Region
End Class
Public Class CarCollection
Inherits List(Of Car)
'// Тестовая коллекция
'// Тут при необходимости можешь добавить свои методы
'// или функции, либо переопределить существующие..
End Class
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'// Тестируем
Dim MyCarCollection As New CarCollection
With MyCarCollection
.Add(New Car(Color.Red))
.Add(New Car(Color.Yellow))
.Add(New Car(Color.Green))
End With
For Each Car As Car In MyCarCollection
Console.WriteLine(Car.Color.ToString)
Next
End Sub
End Class
Номер ответа: 2
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #2
Добавлено: 12.10.06 00:32
Не совсем понял пример - а где тут рекурсивный обход? Проблема-то именно с ним.
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 12.10.06 02:40
твой Enumerator должен реализовывать рекурсивный обход вложеных коллекций вот и все, что непонятного?