AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schon wieder: Warum Interfaces II

Ein Thema von Benmik · begonnen am 22. Jun 2020 · letzter Beitrag vom 26. Jun 2020
Antwort Antwort
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#1

AW: Schon wieder: Warum Interfaces II

  Alt 22. Jun 2020, 19:07
Ich stelle Dir einfach mal eine Aufgabe:
Zurück auf die Schulbank!

Danke, stahli. Die Objekte nicht freigeben und dennoch kein Memoryleak erhalten - hm, da könnten doch nicht etwa Interfaces ins Spiel kommen...?!

Ich probiere das später mal aus.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#2

AW: Schon wieder: Warum Interfaces II

  Alt 22. Jun 2020, 19:36
Stop! Nur weil man Interfaces benutzt bedeutet das nicht zwangsläufig, dass die implementierenden Instanzen automatisch freigegeben werden. Wenn man das möchte, leitet man zweckmäßigerweise von TInterfacedObject ab, falls nicht, von TInterfacedPersistent.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#3

AW: Schon wieder: Warum Interfaces II

  Alt 22. Jun 2020, 20:19
Und kann das richtig sein, dass die Objekte direkt von TObject abgeleitet sein sollen - das müsste ja in einem Cast von Object zu Interface enden... ?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Schon wieder: Warum Interfaces II

  Alt 22. Jun 2020, 20:46
Und kann das richtig sein, dass die Objekte direkt von TObject abgeleitet sein sollen - das müsste ja in einem Cast von Object zu Interface enden... ?
Stimmt, Du solltest also von TInterfacedObject ableiten, aber alle davon. Das ist die kleinste Klasse, die Interfaces und ARC unterstützt.
Auf keinen Fall eine Basisklasse erstellen, die procedure Log einführt. (Warum, können wir später nochmal besprechen.)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
bepe

Registriert seit: 17. Okt 2006
119 Beiträge
 
#5

AW: Schon wieder: Warum Interfaces II

  Alt 22. Jun 2020, 20:55
Weiteres Beispiel sind Binary übergreifende Objekte. So kann man die Funktionalität erweitern ohne eine wilde Sammlung von Methoden zu exportieren. Zum Beispiel bei Listen (ListViews oder Grids) habe ich gerne ein Popupmenu mit Funktionen. Wenn ich ein Untermenü zum Exportieren habe, kann ich dieses um Formate erweitern, in dem ich einfach eine weitere DLL ins Programmverzeichnis lege. Ein bisschen Pseudo Code:

Interfaces
Delphi-Quellcode:
  IList = interface
  ['{1359E96A-BE76-4466-AFBA-CAFA950A4052}']
    procedure First;
    procedure Prior;
    procedure Next;
    procedure Last;

    function FieldCount: Integer;
    function FieldCaption(AFieldNo: Integer): String;
    function FieldValue: Variant;
    function Eof: Boolean;

  end;

  IPlugin = interface
  ['{F2D42A98-ECC5-4633-A0E9-C90F1DAB7A88}']

  end;

  IPluginManager = interface
  ['{FB80046D-24EB-4214-966D-D0F97699B3FC}']
    procedure RegisterPlugin(APlugin: IPlugin);

  end;

  IListExporter = interface
  ['{B16E7F30-D6A7-4B83-870A-4E8B072949CC}']
    procedure ExportList(AList: IList);

    function Caption: String;

  end;
DLL Auszug
Delphi-Quellcode:
  TCsvExporter = class(TInterfacedObject, IPlugin, IListExporter)
  public
    procedure ExportList(AList: IList);

    function Caption: string;

  end;

procedure InitPlugin(AManager: IPluginManager);
begin
  AManager.RegisterPlugin(TCsvExporter.Create);
end;

exports
  InitPlugin;
Beim Programmstart wird die DLL geladen und die InitPlugin Prozedur aufgerufen.

Und so ungefähr wird das Menü aufgebaut
Delphi-Quellcode:
var
  CurrentPlugin: IPlugin;
  tmpExporter: IListExporter;
begin
  for CurrentPlugin in tmpManager.Plugins do
  begin
    if CurrentPlugin.GetInterface(IListExporter, tmpExporter) then
      pmExport.Add(tmpExport.Caption);
  end;

Eine weitere Möglichkeit sind .Net Assemblys. Es gibt einige Frameworks für .Net die es für Delphi gar nicht oder nicht annährend in vergleichbarer Qualität gibt. Die benötigte Funktionalität kapsele ich dann in einer Klasse und diese wird per Interface bereitgestellt.

Und noch ein (für uns/mich) sehr wichtiges Beispiel fällt mir ein: Delphi's Tools API (auch nur ein Plugin Beispiel).

(In der echten Welt muss man natürlich noch auf Aufrufkonventionen und Datentypen/Marshalling achten....)

mfg,
bp
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Schon wieder: Warum Interfaces II

  Alt 22. Jun 2020, 20:20
Bei beiden explizit genannten Bibliotheken bin ich mit fast 100%ig sicher, dass hier Interfaces genutzt werden, um die automatische Speicherverwaltung zu nutzen. Wenn ich AsyncCall(...) oder gleichermaßen, was aus der OTL aufrufe, dann wird der Klump nach ausführung automatisch weggeräumt und ich muss das nicht selbst freigeben, als ob ich mir eine eigene TThread Klasse gebaut hätte oder so. Ja, TThread hat FreeOnTerminate, aber in den Bibliotheken passiert ja bissle mehr
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#7

AW: Schon wieder: Warum Interfaces II

  Alt 22. Jun 2020, 21:53
Bei beiden explizit genannten Bibliotheken bin ich mit fast 100%ig sicher, dass hier Interfaces genutzt werden, um die automatische Speicherverwaltung zu nutzen.
Vielen Dank für deine Mühe, Stefan. War auch meine Vermutung.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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