Ik kom hier even niet echt uit. Mijn programma bestaat uit een diepe hiërarchische structuur. Om deze op te slaan gebruik ik XML. Eerder deed ik door van buitenaf (deze structuur) een class weg te schrijven en vervolgens (recursief) de kinderen weg te schrijven.
Nu ben ik bezig om alle verantwoordelijkheid en functionaliteit in de classes zelf op te slaan. Alle classes subclassen een abstract hoofdclass, waarin ik zoveel mogelijk standaardfunctionaliteit definieer. Hierin zitten al de lijst voor de kinderen, bepaalde default-values (met setters/getters) die alle subclasses ook moeten hebben, en functies die ook telkens terugkomen. Zo ook de functie voor Open en Save.
Het saven doe ik nu op een hele gave manier, namelijk mbv het Template Method Design Pattern. In de hoofdclass zit een functie Save en een abstract functie SaveThis. Vanuit Save roep ik SaveThis aan, en de subclass moet dus verplicht SaveThis overriden om de dingen opslaan die specifiek voor deze subclass gelden. Daarna sla ik in Save de algemene dingen op, en roep alle Save's van de kinderen uit de lijst aan. Tot zover perfect.
Maar het openen is een heel ander verhaal. Ik weet nu niet hoe en waar ik vanuit de Open functie kan bepalen wat voor type een element moet worden (kan wel daar met een switch natuurlijk, maar dan moet ik voor elke subclass (die toegevoegd wordt) een regel in de switch toevoegen. Maar als ik het vanuit de subclass doe (bijvoorbeeld op het niveau van het itereren van kinderen), krijg ik daar functionaliteit die eigenlijk voor alle subclasses geldt. Kortom, de weg terug vind ik nogal lastig.
Nu ben ik bezig om alle verantwoordelijkheid en functionaliteit in de classes zelf op te slaan. Alle classes subclassen een abstract hoofdclass, waarin ik zoveel mogelijk standaardfunctionaliteit definieer. Hierin zitten al de lijst voor de kinderen, bepaalde default-values (met setters/getters) die alle subclasses ook moeten hebben, en functies die ook telkens terugkomen. Zo ook de functie voor Open en Save.
Het saven doe ik nu op een hele gave manier, namelijk mbv het Template Method Design Pattern. In de hoofdclass zit een functie Save en een abstract functie SaveThis. Vanuit Save roep ik SaveThis aan, en de subclass moet dus verplicht SaveThis overriden om de dingen opslaan die specifiek voor deze subclass gelden. Daarna sla ik in Save de algemene dingen op, en roep alle Save's van de kinderen uit de lijst aan. Tot zover perfect.
Maar het openen is een heel ander verhaal. Ik weet nu niet hoe en waar ik vanuit de Open functie kan bepalen wat voor type een element moet worden (kan wel daar met een switch natuurlijk, maar dan moet ik voor elke subclass (die toegevoegd wordt) een regel in de switch toevoegen. Maar als ik het vanuit de subclass doe (bijvoorbeeld op het niveau van het itereren van kinderen), krijg ik daar functionaliteit die eigenlijk voor alle subclasses geldt. Kortom, de weg terug vind ik nogal lastig.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| // Hoofclass public bool Save(XmlWriter xmlWriter) { xmlWriter.WriteStartElement(GetType()); SaveThis(xmlWriter); xmlWriter.WriteAttributeString("Enabled", Enabled.ToString()); xmlWriter.WriteAttributeString("UseFocusCorrector", UseFocusCorrector.ToString()); foreach (CTestFabriekComponent t in list) t.Save(xmlWriter); xmlWriter.WriteEndElement(); return true; } abstract private bool SaveThis(XmlWriter xmlWriter); |
C#:
1
2
3
4
5
6
| // Subclass private override bool SaveThis(System.Xml.XmlWriter xmlWriter) { xmlWriter.WriteAttributeString("Name", strName); return true; } |
edit:
GetType is ook een astract new string in de hoofdclass, waardoor alle subclasses daarin ook hun eigen naam specificeren.
GetType is ook een astract new string in de hoofdclass, waardoor alle subclasses daarin ook hun eigen naam specificeren.
[ Voor 13% gewijzigd door riezebosch op 02-05-2005 10:01 ]
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack