Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Interfacelisten: Objekt wird bei remove freigegeben (https://www.delphipraxis.net/138568-interfacelisten-objekt-wird-bei-remove-freigegeben.html)

alzaimar 13. Aug 2009 13:14

Re: Interfacelisten: Objekt wird bei remove freigegeben
 
Eigentlich wollte ich ein minimalistisch kleines Observer-Pattern mit Interfaces implementieren, sodaß man beliebige Objekte nachträglich damit observieren kann. Dabei soll der Originalcode, also i.A. (Create->Process->Destroy) nicht verändert werden müssen.

Ich wollte dann nur ein Interface definieren, das die zu benachrichtigenden Klassen dann implementieren müssen.
Delphi-Quellcode:
Type
  IObserver = interface
    Procedure Changed (Sender : TObject);
  End;

  TSubject = Class
  private
     fObserver : TInterfaceList;
  Public
     Procedure Subscribe (aObserver : IObserver);
     procedure Unsubscrive(aObserver : IObserver);
     Procedure Changed(Sender : TObject); // Ruft alle Observer in der fObserverListe auf
  End;
Die Implementierung ist ja trivial.

Nun könnte man im existierenden Code einfach durch eine kleine Änderung an den Klassendeklarationen erreichen, das sie als Observer fungieren können.
Delphi-Quellcode:
// Alte Deklaration:
//   TDataViewer = Class (TObject)

// Neue Deklaration
  TDataViewer = Class (TInterfacedObject, IObserver)
    Procedue Changed (Sender : TObject); // Neue Methode, implementiert IObserver
  ...
So einen DataViewer soll man dann mit einem einfachen Subscribe(aDataViewer) o.ä. anmelden können. Wie würdet ihr da vorgehen?

Apollonius 13. Aug 2009 14:00

Re: Interfacelisten: Objekt wird bei remove freigegeben
 
Der TDataViewer sollte keine Referenzzählung durchführen, d.h. AddRef und Release leer implementieren. Man könnte auch eine Klasse zur Verfügung stellen, die IInterface entsprechend implementiert, und von der dann (anstatt von TInterfacedObject) abgeleitet werden kann.

alzaimar 13. Aug 2009 17:05

Re: Interfacelisten: Objekt wird bei remove freigegeben
 
Ok, die Veränderung von TInterfacedObject (Referenzzählung überschreiben) wäre die Lösung. Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz