Ik ben momenteel bezig met een programma waarin diverse soorten variabelen aangemaakt kunnen worden. Deze worden in een grote lijst bewaard. Als basis heb ik het volgende object:
(overige code weggeknipt)
Hier zijn nog twee objecten vanaf geleid:
Nu heb ik ook een standaard ObjectList:
Als voorbeeld voeg ik nu 2 objecten toevoeg aan de lijst:
In de constructor zorg ik dat de soort-variabele wordt gevuld met een 1 of 2. (In de werkelijke code is dit natuurlijk een enumerator).
Nu verwacht ik dat als ik aan de objlist vraag IsFunction('Test.Test2'), dat objlist gaat naar
TObjList.IsFunction en daar achter komt dat Test de naam is van van object nummer 2 en daarna de functie IsFunction(2,'Test2') uitvoert.
Dit gaat goed.
Nu komt de code terecht in TObj.IsFunction(), want die is in Type1 en Type2 niet opnieuw gedefinieerd.
Deze code is als volgt:
Hij komt er nu achter dat er geen punt inzit en dus moet uitzoeken of het een eigen functie is binnen het object. En nu komt mijn vraag, waarom springt de code nu naar TObj.IsOwnFunction('Test2') en niet naar Type2.IsOwnFunction('Test2'), terwijl ik middels de 'case of' het exacte type specificeer?
En daarnaast nog een tweede vraag, hoe kan ik voorkomen dat ik elke keer alle types moet opgeven, en dat het programma zelf uitzoekt wat voor type dit is?
Het heeft denk ik te maken met de code woorden abstract, virtual, dynamic, override, maar ik kan nergens een soortgelijke situatie vinden
PS, ik heb hem in SEA gezet omdat ik denk dat dit iets algemeens is. Als hij naar PRG moet, zie ik dat vanzelf.
(overige code weggeknipt)
Delphi:
1
2
3
4
5
6
7
8
| TObj=class Naam:string; Soort:Integer; public function IsFunction(Func:string):boolean; private function IsOwnFunction(Func: string): boolean; end; |
Hier zijn nog twee objecten vanaf geleid:
Delphi:
1
2
3
4
| Type1=class(TObj) private function IsOwnFunction(Func: string): boolean; end; |
Delphi:
1
2
3
4
| Type2=class(TObj) private function IsOwnFunction(Func: string): boolean; end; |
Nu heb ik ook een standaard ObjectList:
Delphi:
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
| TObjList=class(TObjectList) function IsFunction(Func:string):boolean; overload; function IsFunction(Index: Integer; Rest: string): boolean; overload; public function IndexOf(Naam:string):Integer; end; function TObjList.IsFunction(Func: string): boolean; var Index: Integer; Basis:string; Rest:string; begin Basis:=Copy(Func,1,Pos('.',Func)-1); Rest:=Copy(Func,Pos('.',Func)+1, 1000); Index:=Indexof(Basis); //Code van IndexOf heb ik weggelaten Result:=IsFunction(Index, Rest); end; function TObjList.IsFunction(Index: Integer; Rest: string): boolean; begin Result:=False; if Index>-1 then case TObj(Items[Index]).Soort of 1:Result:=Type1(Items[Index]).IsFunction(Rest); 2:Result:=Type2(items[Index]).IsFunction(Rest); end; end; |
Als voorbeeld voeg ik nu 2 objecten toevoeg aan de lijst:
Delphi:
1
2
| objlist.add(type1.create('Dummy')); objlist.add(type2.create('Test')); |
In de constructor zorg ik dat de soort-variabele wordt gevuld met een 1 of 2. (In de werkelijke code is dit natuurlijk een enumerator).
Nu verwacht ik dat als ik aan de objlist vraag IsFunction('Test.Test2'), dat objlist gaat naar
TObjList.IsFunction en daar achter komt dat Test de naam is van van object nummer 2 en daarna de functie IsFunction(2,'Test2') uitvoert.
Dit gaat goed.
Nu komt de code terecht in TObj.IsFunction(), want die is in Type1 en Type2 niet opnieuw gedefinieerd.
Deze code is als volgt:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
| function TObj.IsFunction(Func: string): boolean; var Punt:Integer; begin Punt:=Pos('.',Func); Result:=false; if Punt=0 then begin result:=IsOwnFunction(Func); end; // De else is voor het voorbeeld niet belangrijk end; |
Hij komt er nu achter dat er geen punt inzit en dus moet uitzoeken of het een eigen functie is binnen het object. En nu komt mijn vraag, waarom springt de code nu naar TObj.IsOwnFunction('Test2') en niet naar Type2.IsOwnFunction('Test2'), terwijl ik middels de 'case of' het exacte type specificeer?
En daarnaast nog een tweede vraag, hoe kan ik voorkomen dat ik elke keer alle types moet opgeven, en dat het programma zelf uitzoekt wat voor type dit is?
Delphi:
1
2
3
4
| case TObj(Items[Index]).Soort of 1:Result:=Type1(Items[Index]).IsFunction(Rest); 2:Result:=Type2(items[Index]).IsFunction(Rest); end; |
Het heeft denk ik te maken met de code woorden abstract, virtual, dynamic, override, maar ik kan nergens een soortgelijke situatie vinden
PS, ik heb hem in SEA gezet omdat ik denk dat dit iets algemeens is. Als hij naar PRG moet, zie ik dat vanzelf.
[ Voor 1% gewijzigd door jvdmeer op 26-10-2007 23:28 . Reden: Sluittags verbeterd ]