VB.NET, шаблоны, рефлексия, наследование, чувство дрейфа - PullRequest
1 голос
/ 11 мая 2010

Я только что придумала проблему и теперь думаю, как ее решить.

Для начала я использую некоторые сторонние компоненты, включая некоторые элементы управления календарем, такие как расписание и временная шкала. Они используются в классах проекта более или менее так:

Friend Class TimeBasedDataView
    'some members
End Class

Friend Class ScheduleDataView
    Inherits TimeBasedDataView

    Public Schedule As Controls.Schedule.Schedule
    'and others
End Class

Friend Class TimeLineDataView
    Inherits TimeBasedDataView

    Public TimeLine As Controls.TimeLine.TimeLine
    'and others
End Class

(Хм, окраска кода не удалась, не говоря уже о ...) Теперь, чтобы позволить управлять внешним видом представляемых данных, есть некоторые механизмы, включая так называемые менеджеры стилей. Много кода в них повторяется, изменяясь почти только в зависимости от поддерживаемого им элемента управления:

Friend Class TimeLineStyleManager
    Private m_TimeLine As TimeLineDataView

    Private Sub Whatever()
        m_TimeLine.TimeLine.SomeProperty = SomeValue
    End Sub
End Class

Friend Class ScheduleStyleManager
    Private m_Schedule As ScheduleDataView

    Private Sub Whatever()
        m_Schedule.Schedule.SomeProperty = SomeValue
    End Sub
End Class

Мне было интересно, смогу ли я создать какой-нибудь базовый класс для этих менеджеров, например

Friend Class TimeBasedCtrlStyleManagerBase(Of T As TimeBasedDataView)
    Private m_Control As T
    'and others
End Class

, который объединит эти два, но я заблудился, когда дело дошло до поддержки двух компонентов, которые не имеют ничего общего (кроме имен их свойств и т. Д.). Типа отражение может быть? Буду благодарен за любые советы;)

Ответы [ 2 ]

0 голосов
/ 11 мая 2010

Вы сделали абсолютно правильные вещи - наследование и обобщения являются идеальными для этой ситуации - но я бы сделал класс TimeBasedCtrlStyleManagerBase MustInherit / abstract, а затем просто наследовал бы ваших двух конкретных менеджеров.

Весь общий код управления идет в абстрактный базовый класс, а любой конкретный код - в два конкретных менеджера.

Конечно, вам нужно изменить Private m_Control As T на Protected m_Control As T, чтобы это работало.

Friend Class TimeLineStyleManager
    Inherits TimeBasedCtrlStyleManagerBase(Of TimeLineDataView)
End Class

Friend Class ScheduleStyleManager
    Inherits TimeBasedCtrlStyleManagerBase(Of ScheduleDataView)
End Class
0 голосов
/ 11 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...