пятница, 5 декабря 2014 г.

И ещё раз про "примеси". Теперь - "серьёзно"

Было - Коротко. Контроль за созданием/освобождением объектов. Только код. №4

Стало:

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.

 "Примеси" - рулят.

Комментариев нет:

Отправить комментарий