多实例(20分)

  • 主题发起人 主题发起人 新手101010
  • 开始时间 开始时间

新手101010

Unregistered / Unconfirmed
GUEST, unregistred user!
如果有一个类,可以有多个实例,我想分清各个实例,于是我在类中加入了一个ID的属性来区分它们,在运行时,该类的实例多次被动态的创建和销毁,可是怎么样保持ID属性是唯一的值
 
开一个全局变量 id :integer;
formcreate中 id:=0;//初始化

begin
myobj:=tMyobject.create;
myobj.id:=id+1;
end;

这样每个id都是唯一的!
 
可以使用全局变量或信号量来控制,具体实现可参考Interface类的定义与实现
 
你应该建一个类似TThreadList的类,来维护您要的ID,具体请参考TThreadList类的源码
 
定义一个TStrings类型变量,如MyStrings:TStrings;然后实例化MyStrings:=TStringList.Create;(因为TStrings类是一个抽象类,它的实例必须由它的派生类来创建).最后可以通过MyStrings.items.AddObject();将你创建的对象添加进去统一管理.它会为每个对象提供一个索引.
 
下面实现基本可以解决你的问题
---------------------------------------------
type
//目标类
TTargetObject = class
private
FId: integer;
public
constructor Create( const AId: integer );
//Id号对外公开,而且只读。
property Id: integer read FId;
end;

//工厂类
TInstanceFactory = class
private
FIdent: integer;
FObjects: TList;
public
constructor Create;
destructor Destroy
override;
//生成目标对象
function CreateObject: TTargetObject;
end;

{ TTargetObject }

constructor TTargetObject.Create(const AId: integer);
begin
FId := AId;
end;

{ TInstanceFactory }

constructor TInstanceFactory.Create;
begin
FIdent := 0;
FObjects := TList.Create;
end;

function TInstanceFactory.CreateObject: TTargetObject;
var
LObject: TTargetObject;
begin
Result := nil;
try
LObject := TTargetObject.Create( FIdent );
if Assigned( LObject ) then
begin
Result := LObject;
Inc( FIdent )
//或通过其它方法取得唯一索引,比如GUID。
end;
except
//错误处理
end;
end;

destructor TInstanceFactory.Destroy;
begin
//对FObjects的Items中的对象做清除操作,然后再释放。
FObjects.Free;
end;
 
function TInstanceFactory.CreateObject: TTargetObject;
var
LObject: TTargetObject;
begin
Result := nil;
try
LObject := TTargetObject.Create( FIdent );
if Assigned( LObject ) then
begin
Result := LObject;
[red] //这里应该再加一句
FObjects.Add( LObject );[/red]
Inc( FIdent )
//或通过其它方法取得唯一索引,比如GUID。
end;
except
//错误处理
end;
end;
 
后退
顶部