Было - Коротко. Контроль за созданием/освобождением объектов. Только код. №4
Стало:
msWatchedObject.mixin.pas:
msWatchedObjectInstance:
msStringList:
msInterfacedRefcounted:
That's all folks.
"Примеси" - рулят.
Стало:
msWatchedObject.mixin.pas:
{$IfNDef TmsWatchedObject_uses_intf}
// interface
{$Define TmsWatchedObject_uses_intf}
// uses
msCoreObjects
{$Else TmsWatchedObject_uses_intf}
{$IfNDef TmsWatchedObject}
// http://programmingmindstream.blogspot.ru/2014/12/generic-2.html
{$Define TmsWatchedObject}
TmsWatchedObject = class abstract(TmsWatchedObjectParent)
// - Класс, который умеет контроллировать создание/уничтожение своих экземпляров
public
class function NewInstance: TObject; override;
// ms-help://embarcadero.rs_xe7/libraries/System.TObject.NewInstance.html
procedure FreeInstance; override;
// ms-help://embarcadero.rs_xe7/libraries/System.TObject.FreeInstance.html
end;//TmsWatchedObject
{$Else TmsWatchedObject}
// implementation
{$IfNDef TmsWatchedObject_uses_impl}
// uses
SysUtils
{$Define TmsWatchedObject_uses_impl}
{$Else TmsWatchedObject_uses_impl}
// TmsWatchedObject
class function TmsWatchedObject.NewInstance: TObject;
begin
TmsObjectsWatcher.CreateObject(Self, Result);
end;
procedure TmsWatchedObject.FreeInstance;
begin
TmsObjectsWatcher.DestroyObject(Self);
end;
{$EndIf TmsWatchedObject_uses_impl}
{$EndIf TmsWatchedObject}
{$EndIf TmsWatchedObject_uses_intf}
msWatchedObjectInstance:
unit msWatchedObjectInstance;
interface
uses
{$Include msWatchedObject.mixin.pas}
;
type
TmsWatchedObjectParent = TObject;
{$Include msWatchedObject.mixin.pas}
TmsWatchedObjectInstance = class abstract(TmsWatchedObject)
end;//TmsWatchedObjectInstance
implementation
uses
{$Include msWatchedObject.mixin.pas}
;
{$Include msWatchedObject.mixin.pas}
end.
msStringList:
unit msStringList;
interface
uses
{$Include msWatchedObject.mixin.pas}
,
System.Classes
;
type
TmsWatchedObjectParent = TStringList;
{$Include msWatchedObject.mixin.pas}
TmsStringList = class abstract(TmsWatchedObject)
// - Класс, который умеет контроллировать создание/уничтожение своих экземпляров
end;//TmsStringList
implementation
uses
{$Include msWatchedObject.mixin.pas}
;
{$Include msWatchedObject.mixin.pas}
end.
msInterfacedRefcounted:
unit msInterfacedRefcounted;
interface
uses
{$Include msWatchedObject.mixin.pas}
;
type
TmsWatchedObjectParent = TInterfacedObject;
{$Include msWatchedObject.mixin.pas}
TmsInterfacedRefcounted = class abstract(TmsWatchedObject)
// Реализация объектов, реализующих интерфейсы. С ПОДСЧЁТОМ ссылок.
//
// НЕ САМАЯ хорошая реализация, лучше реализация тут - http://18delphi.blogspot.ru/2013/04/iunknown.html
// но в учётом ARC - пользуемся пока "нативной реализаией"
//
// Таже ещё есть вот что "почитать":
// - http://18delphi.blogspot.ru/2013/07/blog-post_3683.html
// - http://18delphi.blogspot.ru/2013/07/1.html
// - http://18delphi.blogspot.ru/2013/07/2.html
// - http://18delphi.blogspot.ru/2013/07/2_18.html
// - http://18delphi.blogspot.ru/2013/07/blog-post_8789.html
public
class function NewInstance: TObject; override;
// ms-help://embarcadero.rs_xe7/libraries/System.TObject.NewInstance.html
end;//TmsInterfacedRefcounted
implementation
uses
{$Include msWatchedObject.mixin.pas}
;
{$Include msWatchedObject.mixin.pas}
// TmsInterfacedRefcounted
class function TmsInterfacedRefcounted.NewInstance: TObject;
begin
Result := inherited NewInstance;
TmsInterfacedRefcounted(Result).FRefCount := 1;
end;
end.
That's all folks.
"Примеси" - рулят.
Комментариев нет:
Отправить комментарий