Hej,
Jeg har en lang række klasser som alle nedarver fra en "parent-klasse".
I denne parentklasse har jeg en funktion som gerne skulle behandle data
i underklasserne(dvs læse properties i underklasserne og derefter udføre
bestemte handlinger afhængig heraf)...
Simplificeret eksempel:
TParent = class
public
Procedure DoStuff;
end;
TChild1 = class(TParent)
FSomeOne: string
published
property SomeOne: string read FSomeOne;
end;
TChild2 = class(TParent)
FSomeTwo: string
published
property SomeTwo: string read FSomeTwo;
end;
Say at jeg nu ønsker at DoStuff skal give lave en ShowMessage() for hver
publiseret string-property så ville jeg kalde:
var
MyChild1: TChild1;
MyChild2: TChild2;
begin
MyChild1.DoStuff;
MyChild2.DoStuff;
end;
....nu begynder det så at blive en smule kringlet:
procedure DoStuff;
var
Count, Loop: Integer;
List: PPropList;
begin
Count := GetPropList(ClassInfo, tkProperties, nil) ;
GetMem(List, Count * SizeOf(PPropInfo)) ;
try
GetPropList(ClassInfo, tkProperties, List) ;
for Loop := 0 to Pred(Count) do
begin
showmessage(List[Loop]^.Name);
end;
finally
FreeMem(List, Count * SizeOf(PPropInfo))
end;
end;
Jeg ville så forvente at få to message-bokse, en der indeholder
"SomeOne" og den anden der indeholder "SomeTwo"...
MEN! ClassInfo dutter ikke. Hvis jeg derimod "snyder" lidt og henter
ClassInfo-pointeren med fra mine childobjecter går det fint...Lidt ala
nedenstående(i praksis har jeg løst det ved at tilføje et argument til
constructoren på parentklassen):
var
MyChild1: TChild1;
MyChild2: TChild2;
begin
MyChild1.DoStuff(MyChild1.ClassInfo);
MyChild2.DoStuff(MyChild2.ClassInfo);
end;
procedure DoStuff(FClassInfo: PTypeInfo);
var
Count, Loop: Integer;
List: PPropList;
begin
Count := GetPropList(FClassInfo, tkProperties, nil) ;
GetMem(List, Count * SizeOf(PPropInfo)) ;
try
GetPropList(FClassInfo, tkProperties, List) ;
for Loop := 0 to Pred(Count) do
begin
showmessage(List[Loop]^.Name);
end;
finally
FreeMem(List, Count * SizeOf(PPropInfo))
end;
end;
Så bliver alt som det skal være og jeg får mine to message-bokse
MEN jeg synes ikke dette er særlig "kønt" og jeg tvivler ærlig talt på
at jeg har gjort det rigtigt
Hvordan kan jeg slippe uden om at skulle
sende child-klassens runtime objektinformation med til parentklassens
funktioner?
Jeg er helt grøn i det her så det er muligt at ovenstående er skudt helt
i hampen, så må i endelig sige til
PS: ovenstående er voldsomt simplificeret i forhold til den aktuelle
situation, men principperne er det samme...
På forhånd tak...
MVH
Thomas