Ik heb een applicatie in VB6 (helaas) en daarin wil ik een paar veranderingen aanbrengen. Helaas kan ik niet goed bedenken hoe ik dat in VB6 (zonder inheritance dus) kan realiseren.
Het probleem is als volgt:
Op een set gegevens moeten verschillende berekeningen worden uitgevoerd. Er is een class (Walker) die de verschillende sets gegevens ophaalt en aanbied aan verschillende verwerkings classes (classes die IGenerator implementeren). Nadat de gegevens verwerkt zijn gaat de Walker alle resultaten verzamelen via een method in IGenerator.
Tot zover niets aan de hand, dit werkt allemaal. Helaas bevatten de Generators nogal wat dubbele code, omdat VB6 natuurlijk geen echte inheritance bied. Nu moet er wat functionaliteit aan alle generators worden toegevoegd (een filter om bepaalde sets gegevens wel of niet te laten verwerken door de betreffende Generator) en ik heb weinig zin om die code in alle Generators te gaan toevoegen.
Ik heb een class gemaakt: FilterGenerator, die IGenerator implementeert en alle calls delegeert aan een interne Generator (een soort decoration pattern dus), ongeveer zo:
Elke soort generator heeft nog een paar extra methods om de resultaten op te halen. Afhankelijk van de class van die Generator zal de Walker bij het ophalen van de resultaten 1 of andere method aanroepen om een class specifiek resultaat op te halen. Dat is nu die FilterGenerator ertussen zit natuurlijk niet meer mogelijk, aangezien de Walker alleen een instance van FilterGenerator zien en niet meer de onderliggende Generator.
Hoe krijg ik het nu zo dat die Walker bij het ophalen van de resultaten nog weet wat voor soort Generator er onder die Filter (en eventueel andere decorations) zit en daar methods op kan aanroepen als hij vind dat dat nodig is?
[edit]
Ik zou natuurlijk een method GetRealGenerator kunnen toevoegen aan IGenerator. Dan moeten alle decorations hun onderliggende Generator returnen en alle Generators moeten zichzelf returnen. Is dat een mooie oplossing, want ik vind het namelijk niet zo prettig om binnen al die Generators code te gaan toevoegen die geen ander doel heeft dan het voldoen aan die gewijzigde interface.
Het probleem is als volgt:
Op een set gegevens moeten verschillende berekeningen worden uitgevoerd. Er is een class (Walker) die de verschillende sets gegevens ophaalt en aanbied aan verschillende verwerkings classes (classes die IGenerator implementeren). Nadat de gegevens verwerkt zijn gaat de Walker alle resultaten verzamelen via een method in IGenerator.
Tot zover niets aan de hand, dit werkt allemaal. Helaas bevatten de Generators nogal wat dubbele code, omdat VB6 natuurlijk geen echte inheritance bied. Nu moet er wat functionaliteit aan alle generators worden toegevoegd (een filter om bepaalde sets gegevens wel of niet te laten verwerken door de betreffende Generator) en ik heb weinig zin om die code in alle Generators te gaan toevoegen.
Ik heb een class gemaakt: FilterGenerator, die IGenerator implementeert en alle calls delegeert aan een interne Generator (een soort decoration pattern dus), ongeveer zo:
Visual Basic 6:
1
2
3
4
5
6
7
8
9
10
11
| Implements Generator Private m_G As Generator ' Klein stapeltje methods die gedelegeerd worden aan m_G Private Sub Generator_Process(r As DAO.Recordset) ' Doe wat filtering en zet dan de boolean Process If Process Then m_G.Process r End Sub |
Elke soort generator heeft nog een paar extra methods om de resultaten op te halen. Afhankelijk van de class van die Generator zal de Walker bij het ophalen van de resultaten 1 of andere method aanroepen om een class specifiek resultaat op te halen. Dat is nu die FilterGenerator ertussen zit natuurlijk niet meer mogelijk, aangezien de Walker alleen een instance van FilterGenerator zien en niet meer de onderliggende Generator.
Hoe krijg ik het nu zo dat die Walker bij het ophalen van de resultaten nog weet wat voor soort Generator er onder die Filter (en eventueel andere decorations) zit en daar methods op kan aanroepen als hij vind dat dat nodig is?
[edit]
Ik zou natuurlijk een method GetRealGenerator kunnen toevoegen aan IGenerator. Dan moeten alle decorations hun onderliggende Generator returnen en alle Generators moeten zichzelf returnen. Is dat een mooie oplossing, want ik vind het namelijk niet zo prettig om binnen al die Generators code te gaan toevoegen die geen ander doel heeft dan het voldoen aan die gewijzigde interface.
[ Voor 11% gewijzigd door Gerco op 21-06-2006 11:39 ]
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!