![]() |
AW: Interfaces Generics
Folgendes kommt aus der Delphi Referenz:
Zitat:
Allerdings schaffe ich es nicht, dass meine Objekte sich automatisch (zb im destructor) aus der Liste austragen, so wie mein Konzept bisher ist. |
AW: Interfaces Generics
Warum sollten sich deine Objekte auch selber aus der Liste austragen?
Ein Interface hat den besonderen Vorteil, dass es sich selber aus dem Speicher entfernt, wenn keiner mehr etwas von ihm wissen möchte. Nehmen wir an dein System verwaltet die Newspaper von 3 Publishern. Bei allen tragen sich ein paar Leutchen als Empfänger (Subscriber) ein, davon einige auch bei 2 oder sogar 3 Publishern. Irgendwann hat einer (Subscriber) keine Lust mehr und meldet sich von einem Publisher wieder ab. Ist dieser jenige Subscriber bei keinem anderen Verlag mehr angemeldet, dann verschwindet er automatisch aus dem System. Das ist auch gut so, denn für die Verwaltung wird diese Person nicht mehr benötigt. Er bekommt ja von keinem mehr ein Newspaper, wozu also damit noch belasten. Es funktioniert also genau anders herum. Das Objekt (Interface) wird nicht gelöscht und dadurch aus den Listen entfernt, sondern wenn es aus allen Listen entfernt wurde, dann verschwindet es im Daten-Nirwana. Deine Deklaration vom Publisher ist etwas suboptimal. Wozu sind die Methoden als
Delphi-Quellcode:
deklariert?
virtual; abstract;
Diese Methoden sind für alle abgeleiteten Klassen gleich und können direkt in
Delphi-Quellcode:
implementiert werden.
TPublisher
Und wie willst du in einer abgeleiteten Klasse auf das private (upps, das war ja protected ... o graus) Feld
Delphi-Quellcode:
zugreifen? Das würde nur funktionieren, wenn sich die abgeleiteten Klassen in der selben Unit befinden.
FSubscribers
Delphi-Quellcode:
Ab jetzt kann jeder Publisher Subscriber aufnehmen und entfernen, sowie Newspaper an seine Subscriber ausliefern, ohne bei der Ableitung noch weiteren Code hinzufügen zu müssen.
type
TNewspaper = class private FTitle : String; procedure SetTitle(const Value : String); public property Title : String read FTitle write SetTitle; end; ISubscriber = interface procedure GetNewspaper(Newspaper : TNewspaper); end; TPublisher = class private FSubscribers : TList<ISubscriber>; public constructor Create; destructor Destroy; override; procedure AddSubscriber(Subscriber : ISubscriber); procedure RemoveSubscriber(Subscriber : ISubscriber); procedure SendNewsToAllSubs( Newspaper : TNewspaper ); end; implementation constructor TPublisher.Create; begin inherited; FSubscribers := TList<ISubscriber>.Create; end; destructor TPublisher.Destroy; begin FSubscribers.Free; inherited; end; procedure TPublisher.AddSubscriber(Subscriber : ISubscriber); begin FSubscriber.Add( Subscriber ); end; procedure TPublisher.RemoveSubscriber(Subscriber : ISubscriber); begin FSubscriber.Remove( Subscriber ); end; procedure TPublisher,SendNewsToAllSubs( Newspaper : TNewspaper ); var LSubscriber : ISubscriber; begin for LSubscriber in FSubscribers do LSubscriber.GetNewspaper( Newspaper ); end; |
AW: Interfaces Generics
Mag offtopic sein, aber BÜDDE, BÜDDE, mit Zucker obendrauf: Benutzt richtige Calling canventions wenn ihr schon Interfaces nehmt.
Delphi Interfaces sind COM-kompatibel. Man könnte also eigentlich problemlos Implemtierungen in C#, C++, FPC, D, etc. erzeugen. Aber nur wenn nicht Borlands Fastcall AKA register benutzt wird! Also safecall oder stdcall, aber nicht gar nix... Wollte letztlich was mit der OTA machen und hatte ein recht schmerzhaftes Facepalm als ich sah, dass die Honks von Borland die OTA-Interfaces tatsächlich in register geschrieben haben. :wall: |
AW: Interfaces Generics
Zitat:
Delphi-Quellcode:
.
register
Gruß, Sven |
AW: Interfaces Generics
Zitat:
Oder du willst eine Funktion aus .Net/C++/.etc benutzen, und kannst deine Instanzen nicht direkt übergeben, sondern musst sie erst verpacken, nur weil du kein "safecall" oder "stdcall" hinter die Methoden namen packen wolltest. Klasse! :thumb: |
AW: Interfaces Generics
Zitat:
Falls man wirklich mal Compiler übergreifend arbeiten will, ist wohl stdcall hinten dran schreiben das geringste Problem oder benutzt du in Interfaces Signaturen nur COM kompatible Datentypen (TObject in C#? Viel Spaß!) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr. |
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