2010-05-11 8 views
1

Je viens de me faire un problème et je me demande maintenant comment le résoudre. Pour commencer, j'utilise des composants tiers, y compris des contrôles de calendrier tels que le calendrier et la chronologie. Ils sont utilisés dans les classes de projets plus ou moins comme ça:VB.NET, modèles, réflexion, héritage, sentiment de dérive

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 

(Hmm, coloration du code échoue, peu importe ...) Maintenant, pour permettre la gestion de l'aspect des données présentées il y a des mécanismes, y compris soi-disant gestionnaires de style. Beaucoup de code dans les répète, variant presque uniquement avec le contrôle qu'il maintient:

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 

Je me demandais si je pouvais créer une classe de base pour les gestionnaires, comme

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

qui unifierait ces deux, mais je me suis perdu quand il s'agissait de maintenir deux composants qui n'ont rien en commun (sauf les noms de leurs propriétés, etc.). Type de réflexion peut-être? Je vous serais reconnaissant pour tout conseil;)

Répondre

0

On dirait que vous avez un cas où vous cherchez à introduire l'héritage, où ce n'est pas nécessaire - il aurait été préférable si la troisième partie contrôle tous adhéré à une interface commune (et les génériques ont peut-être sauvé le jour), mais comme ils sont des tiers, je suppose que vous avez un impact minime sur la direction future de celui-ci.

0

Vous avez fait exactement le bon type de chose - l'héritage et les génériques sont parfaits pour cette situation - mais je ferais la classe TimeBasedCtrlStyleManagerBase MustInherit/abstract et hériterais simplement de vos deux gestionnaires spécifiques.

Tout le code de gestion commun va dans la classe de base abstraite et tout code spécifique va dans les deux gestionnaires spécifiques.

Bien sûr, vous devrez changer Private m_Control As T en Protected m_Control As T pour que cela fonctionne.

Friend Class TimeLineStyleManager 
    Inherits TimeBasedCtrlStyleManagerBase(Of TimeLineDataView) 
End Class 

Friend Class ScheduleStyleManager 
    Inherits TimeBasedCtrlStyleManagerBase(Of ScheduleDataView) 
End Class 
+0

Oui, je l'ai déjà compris (MustInherit et protégé). Mon problème est comment faire de la classe de base pour utiliser le contrôle interne approprié (m_Control.TimeLine ou m_Control.Schedule) ou, par exemple, enums à partir de l'espace de noms approprié dans certains cas (comme Controls.Schedule.TriState). – brovar

+0

Je sais que cela semble désordonné, mais c'est tout le point pour moi, car un gestionnaire a, par exemple, boucle: "Pour chaque MyFormat As TimeLine.TimeLineFormatCondition [...]" et l'autre: "Pour chaque MyFormat comme calendrier .ScheduleFormatCondition [...] "avec certaines variables de ces types de planning/timeline à l'intérieur, mais le corps lui-même est identique. – brovar

+0

@brovar - ce n'est pas si compliqué - tout ce qui est commun est dans la classe générique de base et tous les éléments spécifiques que vous mentionnez vont dans les classes de gestionnaire dérivées. C'est juste comment ça fonctionne. Si vous avez d'autres problèmes, postez peut-être une nouvelle question (avec un lien dans un commentaire ici) ou ajoutez plus de détails à cette question? – Enigmativity