Stel ik heb een aantal klassen, ik kom erachter dat ik het een en ander aan herhaling doe, dus ik wil code refactoren. Na wat onderzoek blijkt het enige dat steeds anders is, een query string is.
Joepie!
Ik heb dus een generieke basis klasse geschreven met een aantal methoden, zoiets:
Welnu, ik ben tegen het volgende aangelopen, namelijk het gebrek aan een nette manier om de querystring bekend te maken aan de base class. Momenteel doe ik het als volgt:
Ik definieer, in de ClassBase, een property en in de methods overrides in de ConcreteClass roep ik eenvoudig de base aan. Zoiets als dit:
Het werkt verder prima, maar ik krijg er echt een vieze nasmaak van in m'n mond. Het voelt alsof het niet klopt. Heeft iemand misschien tips hoe ik dit netter zou kunnen oplossen? Er is ook nog een abstracte property in de base, die in de concrete override wordt, maar dat is iets wat voor heel die bewuste concrete klasse gelijk is en in zo'n geval vind ik het een mooie oplossing.
Aangezien die query string steeds het enige is dat varieert, denk ik dat ik er wel iets meer mee kan doen, maar het komt er niet echt uit zeg maar
Ik heb er overigens geen problemen de structuur grondig te wijzigen als dat nodig is
Joepie!
Ik heb dus een generieke basis klasse geschreven met een aantal methoden, zoiets:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| // illustratief voorbeeld public abstract ClassBase<T> { public virtual T GetIets(int x) { // logica } public virtual List<T> GetNogMeer() { // logica } } // met nog eental concrete public ConcreteClass : Classbase<ConcreteClass> { public override ConcreteClass GetIets(int x) { // zorg dat de base de juist query string kan gebruiken return base.GetIets(x); } public override List<ConcreteClass> GetNogMeer() { // zorg dat de base de juist query string kan gebruiken return base.GetNogMeer(); } } |
Welnu, ik ben tegen het volgende aangelopen, namelijk het gebrek aan een nette manier om de querystring bekend te maken aan de base class. Momenteel doe ik het als volgt:
Ik definieer, in de ClassBase, een property en in de methods overrides in de ConcreteClass roep ik eenvoudig de base aan. Zoiets als dit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| // illustratief voorbeeld public abstract ClassBase<T> { public abstract Type<T> Porp { get; } public string Prop{ get; set; } public virtual T GetIets(int x) { // doe iets met Prop // Type<T> ding = Porp // verzameling = ding.doeIets } public virtual List<T> GetNogMeer() { // doe iets met Prop // Type<T> ding = Porp // verzameling = ding.doeIets } } // met nog eental concrete public ConcreteClass : Classbase<ConcreteClass> { // in dit geval wel prima natuurlijk! public override Type<ConcreteClas> { get { return Ding; } } public override ConcreteClass GetIets(int x) { // zorg dat de base de juist query string kan gebruiken base.Prop = "Henk"; return base.GetIets(x); } public override List<ConcreteClass> GetNogMeer() { // zorg dat de base de juist query string kan gebruiken base.Prop = "Piet"; return base.GetNogMeer(); } } // in het echt gaat het om 2 properties en ik irriteer me er mateloos aan! |
Het werkt verder prima, maar ik krijg er echt een vieze nasmaak van in m'n mond. Het voelt alsof het niet klopt. Heeft iemand misschien tips hoe ik dit netter zou kunnen oplossen? Er is ook nog een abstracte property in de base, die in de concrete override wordt, maar dat is iets wat voor heel die bewuste concrete klasse gelijk is en in zo'n geval vind ik het een mooie oplossing.
Aangezien die query string steeds het enige is dat varieert, denk ik dat ik er wel iets meer mee kan doen, maar het komt er niet echt uit zeg maar
Ik heb er overigens geen problemen de structuur grondig te wijzigen als dat nodig is
[ Voor 12% gewijzigd door Verwijderd op 15-12-2010 23:45 ]