Help me with a solution for what could be solutioned by virtual static fields... in FPC
I'm doing an event manager in Freepascal
Each event is an object type T开发者_如何学GoEvent (=object), each kind of event must derive from this class. Events are differentiated by an integer identificator, assigned dynamically. The problem is that i want to retrieve the event id of an instance, and i can't do it well.- All instances of a class(object) have a unique id => so it should be static field.
- All classes have a diferent id => so it should be virtual.
- Event ids are assignated in run time, and can change => so it can't be a simple method
In sum, I can't put all this together.
I'm looking for an elegant solution, i don't want to write a hardcoded table, actualizing it in every constructor... etc, i'd prefer something taking advantage of the polymorphism Can anyone help me with another technical or design solution? I remark I don't want to use class instead of object construct.(property doesn't work on objects? :(You might need class var like stuff, like in newer delphi's. But that is in the development version of FPC only (2.5.1+).
Note that the object type is TP legacy, and hasn't been developed on in this millenium, and I don't expect that to change. If you need more than it offers, I suggest to use classes.
You can make a simple table/list like this:
unit classids;
{$mode objfpc}{$H+}
interface
function GetClassID(c:TClass):Integer;
procedure SetClassID(c:TClass; id:Integer);
property ClassID[c:TClass]:Integer read GetClassID write SetClassID;
implementation
uses Maps;
var Map:TMap;
function GetClassID(c:TClass):Integer;
begin
if not Map.GetData(c,Result) then
Result:=0; //Or any default you like
end;
procedure SetClassID(c:TClass; id:Integer);
begin
Map.Delete(c);
Map.Add(c,id);
end;
initialization
Map:=TMap.Create(itu4,SizeOf(Integer));
finalization
FreeAndNil(Map);
end.
Then you can get/set the id with
ClassID[TMyObject]:=12;
ShowMessage(IntToStr(ClassID[TMyObject])); //shows 12
Good luck
精彩评论