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.