Einzelnen Beitrag anzeigen

Devstructor

Registriert seit: 7. Sep 2016
4 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Observer-Pattern Implementation

  Alt 11. Nov 2016, 10:33
Bitte

Das ist aber gar nicht nötig, sondern eher unschön. Die TInterfacedList wird dir nicht einfach zerstört. Dafür ist es wichtig zu wissen, wann Interfaces mit Referenzenzähler zerstört werden.

Als erstes muss der Referenzzähler aktiv sein. Bei einem TComponent wurde das zum Beispiel deaktiviert, doch die TInterfacedList ist abgeleitet von TInterfacedObject und dort werden die Referenzen gezählt. Es scheint also, als wäre die TInterfacedList gefährlich, dem ist aber nicht so.

Das Objekt wird zerstört, wenn die Referenz inkrementiert wurde und danach wieder den RefCount 0 erreicht. Wenn du den RefCount nicht erhöhst, wird auch nichts zerstört.
Um jetzt das TMBSubject zu zerstören, müsste man sich blöd anstellen. Man müsste nämlich auf die TInterfaceList mit einer Interface-Referenz zugreifen. Sprich man müsste die Liste über IInterfaceList steuern. Das ist einerseits daneben, denn man hat ja die Liste als Objekt, da muss man nicht noch eine Referenz eines Interfaces ansprechen, andererseits ist das auch nicht möglich, denn die InterfacedList ist im private Teil und alle Operationen auf dieser Liste werden in TMBSubject erledigt.

Folglich wird dir nicht einfach irgendwas zerstört und das Ganze ist sicher im Gebrauch, sonst hätte die TInterfacedList überhaupt keine Existenzberechtigung.

Wenn man die Liste zerstören möchte, müsste man in TMBSubject soetwas machen:
Delphi-Quellcode:
procedure TMBSubject.ClearObservers;
var
  MeineListeAlsInterfacec: IInterfaceList;
begin
  if Supports(FObservers,IInterfaceList,MeineListeAlsInterfacec) then
  begin
    MeineListeAlsInterfacec.Clear;
  end;
end;
Anstelle von diesem ,,normalen" Vorgehen
Delphi-Quellcode:
procedure TMBSubject.ClearObservers;
begin
  FObservers.Clear;
end;
  Mit Zitat antworten Zitat