开发者

Help me with a solution for what could be solutioned by virtual static fields... in FPC

开发者 https://www.devze.com 2022-12-21 17:05 出处:网络
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.

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

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号