Ваша задача - разработать библиотеку классов Project Plan, которая поддерживает отслеживание задач (аналогично тому, как работает MS Project). Эта библиотека классов имеет объект Task
(среди прочих).
Объект Task
обладает, среди прочего, свойствами EstimatedHours
(Double
), StartDate
(DateTime
) и EndDate
(DateTime
). У объекта Task
может быть один родительский Task
и несколько дочерних Task
объектов. Свойства EstimatedHours
, StartDate
и EndDate
объекта Task
, у которого есть дочерние элементы (являются родительскими), зависят от этих свойств его непосредственных дочерних элементов. Родитель Task
StartDate
является самым ранним StartDate
из его детей. Родитель Task
EndDate
является последним EndDate
его потомком. Родитель Task
EstimatedHours
- это сумма его детей EstimatedHours
. Поэтому недопустимо изменять эти свойства для Task
, у которого есть дочерние элементы.
Как бы вы справились со случаем использования, когда значения EstimatedHours, StartDate или EndDate изменяются в задаче, у которой есть родительский элемент? (Свойства родительского элемента являются отражением его дочерних элементов, поэтому любые изменения в дочерних элементах может потребоваться корректировка свойств родителя для надлежащего отражения изменений)
Один из вариантов - это событие, когда каждое свойство изменяется. Родитель Task
будет прослушивать эти события на своих непосредственных дочерних объектах Task
и вносить соответствующие изменения в свои собственные свойства при возникновении этих событий. Это хороший подход или есть лучший способ? Как бы ты сделал это?
Вот основная идея того, как может выглядеть Task
объект:
Public Class Task
Private mChildren As List(Of Task)
Private mEndDate As DateTime = DateTime.MinVlue
Public Property EndDate() As DateTime
Get
Return mEndDate
End Get
Set(ByVal value As DateTime)
mEndDate = value
'What to do here?
End Set
End Property
Private mEstimatedHours As Double = 0.0
Public Property EstimatedHours() As Double
Get
Return mEstimatedHours
End Get
Set(ByVal value As Double)
mEstimatedHours = value
'What to do here?
End Set
End Property
Private mStartDate As DateTime = DateTime.MinVlue
Public Property StartDate() As DateTime
Get
Return mStartDate
End Get
Set(ByVal value As DateTime)
mStartDate = value
'What to do here?
End Set
End Property
End Class