Beetje wazige topictitel misschien, maar ik leg het even uit.
Ik heb een situatie waarin ik classes genereer.
Al de gegenereerde classes erven over van een (eigen) baseclass.
nu wil ik een Equals() functie schrijven waarin ik kan zien of object1 gelijk is aan object2.
Echter is het type van object1 en object2 onbekend.
Dat wil zeggen. Ze zijn gegenereerd, erven over van de baseclass, maar ik wil ze vergelijken op specifieke gegevens.
resumé:
Class1 heeft property 'naam'
Class2 heeft property 'kleur'
Class3 heeft property 'x'
...
etc.
Ze erven allen over van baseclass.
Nu heb ik 2 van die objecten (wel allebij van dezelfde class, maar ik weet niet welke) en wil ik kijken of deze objecten gelijk zijn.
Mijn Class1 heeft de onderstaande functie:
Echter kan ik deze niet aanroepen, omdat in mijn programma ik niet weet dat het een Class1 betreft.
Nu heb ik het volgende, wat wel werkt:
Echter is wel duidelijk dat je zoiets met generics wilt oplossen.
Ik wil dus niet voor al mijn classes zeggen:
voordat mensen nu gaan roepen "je ontwerp is fout" etc., zal ik even iets meer uitleg geven:
Het gaat om class generatie adhv een database.
Ik wil de objecten cachen, en genereer daarom nu in alle classes een eigen caching mechanisme. Dit werkt prima, maar 99% van de code van het mechanisme komt in AL die classes terug.
Hierdoor vind ik mijn dll te groot worden, en ik wil dit op een ander niveau regelen. Zodoende wil ik op het niveau van de baseclass mijn caching code plaatsen, echter is die één procent code die wel class specifiek is nogal lastig te bouwen als ik niet weet welke class het is.
Ik weet namelijk niet of ik op naam moet vergelijken of op kleur of lengte of whatever..
Hoe vlieg je zoiets aan?
Ik heb een situatie waarin ik classes genereer.
Al de gegenereerde classes erven over van een (eigen) baseclass.
nu wil ik een Equals() functie schrijven waarin ik kan zien of object1 gelijk is aan object2.
Echter is het type van object1 en object2 onbekend.
Dat wil zeggen. Ze zijn gegenereerd, erven over van de baseclass, maar ik wil ze vergelijken op specifieke gegevens.
resumé:
Class1 heeft property 'naam'
Class2 heeft property 'kleur'
Class3 heeft property 'x'
...
etc.
Ze erven allen over van baseclass.
Nu heb ik 2 van die objecten (wel allebij van dezelfde class, maar ik weet niet welke) en wil ik kijken of deze objecten gelijk zijn.
Mijn Class1 heeft de onderstaande functie:
C#:
1
2
3
4
| public bool Equals(Class1 obj) { return naam.Equals(obj.naam); } |
Echter kan ik deze niet aanroepen, omdat in mijn programma ik niet weet dat het een Class1 betreft.
Nu heb ik het volgende, wat wel werkt:
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
44
45
46
47
48
49
50
51
| public class BaseClass { public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) return false; if (obj is Class1) { Class1 c1 = (Class1)this; Class1 c2 = (Class1)obj; return c1.Equals(c2); } else if (obj is Class2) { //...etc. } return false; } } public class Class1 : BaseClass { public string naam; public bool Equals(Class1 obj) { return naam.Equals(obj.naam); } } class Program { static void Main(string[] args) { //dus puur om te testen even wat objecten aanmaken Class1 c1_0 = new Class1(); c1_0.naam = "bas"; Class1 c1_1 = new Class1(); c1_1.naam= "bas"; //hier doen we dus alsof we niet meer weten wat het is. BaseClass b1 = c1_0; BaseClass b2 = c1_1; //en hier vergelijken we ze, wat dus goed gaat Console.WriteLine(b1.Equals(b2)); } } |
Echter is wel duidelijk dat je zoiets met generics wilt oplossen.
Ik wil dus niet voor al mijn classes zeggen:
C#:
1
2
3
| if (obj is Class1) { ... } if (obj is Class2) { ... } if (obj is Class3) { ... } |
voordat mensen nu gaan roepen "je ontwerp is fout" etc., zal ik even iets meer uitleg geven:
Het gaat om class generatie adhv een database.
Ik wil de objecten cachen, en genereer daarom nu in alle classes een eigen caching mechanisme. Dit werkt prima, maar 99% van de code van het mechanisme komt in AL die classes terug.
Hierdoor vind ik mijn dll te groot worden, en ik wil dit op een ander niveau regelen. Zodoende wil ik op het niveau van de baseclass mijn caching code plaatsen, echter is die één procent code die wel class specifiek is nogal lastig te bouwen als ik niet weet welke class het is.
Ik weet namelijk niet of ik op naam moet vergelijken of op kleur of lengte of whatever..
Hoe vlieg je zoiets aan?
This message was sent on 100% recyclable electrons.