Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Рекурсивный обход через ForEach Добавлено: 01.10.06 22:51  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Есть такой каркас классов:
    Public Class clsMailMsg
        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 может содержать в себе себеподобные экземпляры, что делает саму структуру неограниченной по вложенности.
Теперь я хочу, чтобы с экземпляром главного класса можно было работать так:
        Dim foo As New clsMailMsg
        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.IEnumerable
System.Collections.IEnumerator


Но (имхо) гораздо убнее наследовать любую из существующих коллекций (которая тебе подойдет) и приспособить ее для своих целей, поскольку они практически все уже поддерживают этот цикл..

Примерно так..

Public Class Car
    '// Тестовый класс

    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-сайт: neco.pisem.net
 Профиль | | #2
Добавлено: 12.10.06 00:32
Не совсем понял пример - а где тут рекурсивный обход? Проблема-то именно с ним.

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 12.10.06 02:40
твой Enumerator должен реализовывать рекурсивный обход вложеных коллекций вот и все, что непонятного?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам