Le librerie RAD Delphi implementano molti oggetti thread-friendly in un modo che costringe a dichiarare un altro oggetto per memorizzare il riferimento restituito dal metodo di blocco di quell'oggetto. L'oggetto quindi incapsula essenzialmente l'oggetto primo che viene restituito al momento del blocco. Ad esempio;
List := ThreadList.Unlocklist;
// do something with List
ThreadList.LockList;
Perché viene adottato questo approccio? Perché ereditare dall'oggetto primo, aggiungendo l'oggetto di blocco, sovrascrivendo costruttori e distruttori, scoraggiato? Ad esempio la seguente implementazione aggiunge un TMREWSync a un elenco;
IMREWS = interface
['{5B6DE5FA-847B-42D5-8BF4-9EB20A452C54}']
procedure BeginRead;
function BeginWrite: Boolean;
procedure EndRead;
procedure EndWrite;
end;
TThreadList = class ( TList, IMREWS )
private
FLock : TMREWSync;
public
constructor Create;
destructor Destroy; override;
property Lock : TMREWSync read FLock implements IMREWS;
end;
constructor TThreadList.Create;
begin
FLock := TMREWSync.Create;
inherited;
end;
destructor TThreadList.Destroy;
begin
inherited;
FLock.Free;
end;
// Usage:
ThreadList.BeginWrite;
// Do something with ThreadList
ThreadList.EndWrite;