Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Interfaces Generics

  Alt 8. Nov 2012, 22:57
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 virtual; abstract; deklariert?
Diese Methoden sind für alle abgeleiteten Klassen gleich und können direkt in TPublisher implementiert werden.
Und wie willst du in einer abgeleiteten Klasse auf das private (upps, das war ja protected ... o graus) Feld FSubscribers zugreifen? Das würde nur funktionieren, wenn sich die abgeleiteten Klassen in der selben Unit befinden.
Delphi-Quellcode:
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;
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat