Помогите мне с решением для того, что можно решить с помощью виртуальных статических полей ... в FPC - PullRequest
1 голос
/ 28 февраля 2010

Я занимаюсь менеджером событий во Freepascal
Каждое событие является типом объекта TEvent (= object), каждый тип события должен быть производным от этого класса.
События различаются целочисленным идентификатором, назначаемым динамически.
Проблема в том, что я хочу получить идентификатор события экземпляра, и я не могу сделать это хорошо.

  • Все экземпляры класса (объекта) имеют уникальный идентификатор =>, поэтому это должно быть статическое поле.
  • Все классы имеют разные идентификаторы =>, поэтому они должны быть виртуальными.
  • Идентификаторы событий назначаются во время выполнения и могут изменяться =>, поэтому это не может быть простой метод

В общем, я не могу собрать все это вместе.
Я ищу элегантное решение, я не хочу писать жестко закодированную таблицу, воплощать ее в каждом конструкторе ... и т. Д., Я бы предпочел что-то, использующее преимущества полиморфизма
Может ли кто-нибудь помочь мне с другим техническим или дизайнерским решением?
Замечу, что я не хочу использовать класс вместо конструкции объекта. (Свойство не работает с объектами?: (

Ответы [ 2 ]

0 голосов
/ 23 октября 2011

Вы можете создать простую таблицу / список, например:

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.

Тогда вы можете получить / установить идентификатор с помощью

ClassID[TMyObject]:=12;
ShowMessage(IntToStr(ClassID[TMyObject])); //shows 12

Удачи

0 голосов
/ 11 апреля 2010

Возможно, вам понадобится класс var, как в новых Delphi. Но это только в версии разработки FPC (2.5.1 +).

Обратите внимание, что тип объекта является устаревшим TP и не разрабатывался в этом тысячелетии, и я не ожидаю, что это изменится. Если вам нужно больше, чем предлагает, я предлагаю использовать классы.

...