AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Interface aus bestehenden Klassen erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Interface aus bestehenden Klassen erstellen

Ein Thema von fisipjm · begonnen am 19. Mai 2023 · letzter Beitrag vom 22. Mai 2023
Antwort Antwort
Seite 1 von 2  1 2      
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#1

Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 14:40
Hi in die Runde,

ich bin schon seit einiger Zeit Delphi entwickler und möchste meine Fähigkeiten in der Programmierung verbessern und erweitern. Lese aktuell die Bücher von Nick Hodges, kann ich auf diesem weg nur empfehlen.
Zukünfitg will ich meine Enwticklungen immer mit unit Tests ausstatten. Dafür muss ich zukünftig zwangsläufig mit interfaces arbeiten. Mein erster Schritt den ich jeztz machen wollte, war es ein Interface für das laden von lokalen Einstellungen zu erstellen. Also sowas wie:
Delphi-Quellcode:
unit LocalSettingsInterface;

interface

type
  ILocalSetttings = interface
    ['{BAAEC9A9-5D37-48C7-9A60-3AABE21845B7}']
    procedure writeString(const value: string);
    function readString: string;
    procedure writeInteger(value: Integer);
    function readInteger: Integer;
  end;

implementation

end.
Da ich aber eigentlich so gut wie immer die Delphi eigenen klassen verwende, sowas wie Tinifile oder TRegistry, kann ich diese ja nicht von einem IInterfacedObject ableiten. WIe stell ich das an, für bestehende Klassen ein Interface zu erstellen? Oder muss ich immer eine eigene KLassenableitung erstellen? Ich hoffe die Frage ist nicht zu Kindergarten, aber meine bisherige Websuche hat mich irgenwie nicht wirklich schlauer gemacht

Gruß
PJM
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.625 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 14:48
Da ich aber eigentlich so gut wie immer die Delphi eigenen klassen verwende, sowas wie Tinifile oder TRegistry, kann ich diese ja nicht von einem IInterfacedObject ableiten. WIe stell ich das an, für bestehende Klassen ein Interface zu erstellen? Oder muss ich immer eine eigene KLassenableitung erstellen? Ich hoffe die Frage ist nicht zu Kindergarten, aber meine bisherige Websuche hat mich irgenwie nicht wirklich schlauer gemacht
Dazu habe ich vor vielen Jahren mal was geblogt:

Zitat:
Die Alternative könnte wie folgt aussehen:

Man deklariere eine von TInterfacedObject abgeleitete Wrapper-Klasse, welche die lästige Basisimplementation von IUnknown übernimmt und die darüber hinausgehende Implementation von ISomeInterface an TSomeClass delegiert:

Delphi-Quellcode:
type
  TSomeWrapper = class(TInterfacedObject, ISomeInterface)
  protected
    fSomeClass: TSomeClass;
    property SomeClass: TSomeClass read fSomeClass implements ISomeInterface;
  public
    constructor Create(_SomeClass: TSomeClass);
    destructor Destroy; override;
  end;

...

constructor TSomeWrapper.Create(_SomeClass: TSomeClass);
begin
  inherited Create;
  fSomeClass := _SomeClass;
end;

destructor TSomeWrapper.Destroy;
begin
  fSomeClass.Free;
  inherited;
end;
Benutzt wird dieses Objekt wie folgt:

Delphi-Quellcode:
var
  SomeInt: ISomeInterface;
...
  SomeInt := TSomeWmapper.Create(TSomeClass.Create);
  SomeInt.Method1;
...
Man erzeugt also eine Instanz von TSomeWrapper, übergibt ihr eine ebenfalls frisch erzeugte Instanz von TSomeClass, und verwendet sie als ob es sich um eine auf magische Weise auch von TInterfacedObject abgeleitete Version von TSomeClass handelte, weist sie z.B. auf eine Variable vom Typ ISomeInterface zu. Reference-Counting natürlich inklusive.
http://www.dummzeuch.de/delphi/objec...%20L%C3%B6sung
Thomas Mueller

Geändert von dummzeuch (19. Mai 2023 um 14:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 15:15
"Eine" Klasse kann mehrere Interfaces implementieren.
mit bissl gefummel geht es sogar, wenn das Interfaces mit gleichnamigen Methoden sind. (es ist möglich quasi den Methodenname vom Interface in der Klasse anders zu bennennen, falls es konflikte gibt)
class TYourClass = class(TYourBase, IInterface1, IInterface2, ...)

Man kann Interfaces auch voneinander ableiten, also z.B. die zweite Version eines Interfaces (mit neuen Methoden), aber wo die Alten auch drin sind,
$2B or not $2B
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#4

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 16:04
"Eine" Klasse kann mehrere Interfaces implementieren.
mit bissl gefummel geht es sogar, wenn das Interfaces mit gleichnamigen Methoden sind. (es ist möglich quasi den Methodenname vom Interface in der Klasse anders zu bennennen, falls es konflikte gibt)
class TYourClass = class(TYourBase, IInterface1, IInterface2, ...)

Man kann Interfaces auch voneinander ableiten, also z.B. die zweite Version eines Interfaces (mit neuen Methoden), aber wo die Alten auch drin sind,

Hey Himitsu,
danke für deine Antwort, dann müsste ich mir aber immer wie in der Frage schon dangedeutet eine eigene Klasse ableiten. Und dann logischerweise auch die Interface deklaration mit der ageleiteten Klasse und nicht der Basisklasse machen. Das würde ich gern umgehen

Danke aber für den Code, jedes bisschen hilft beim lernen.
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#5

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 16:07
Da ich aber eigentlich so gut wie immer die Delphi eigenen klassen verwende, sowas wie Tinifile oder TRegistry, kann ich diese ja nicht von einem IInterfacedObject ableiten. WIe stell ich das an, für bestehende Klassen ein Interface zu erstellen? Oder muss ich immer eine eigene KLassenableitung erstellen? Ich hoffe die Frage ist nicht zu Kindergarten, aber meine bisherige Websuche hat mich irgenwie nicht wirklich schlauer gemacht
Dazu habe ich vor vielen Jahren mal was geblogt:

Zitat:
Die Alternative könnte wie folgt aussehen:

Man deklariere eine von TInterfacedObject abgeleitete Wrapper-Klasse, welche die lästige Basisimplementation von IUnknown übernimmt und die darüber hinausgehende Implementation von ISomeInterface an TSomeClass delegiert:

Delphi-Quellcode:
type
  TSomeWrapper = class(TInterfacedObject, ISomeInterface)
  protected
    fSomeClass: TSomeClass;
    property SomeClass: TSomeClass read fSomeClass implements ISomeInterface;
  public
    constructor Create(_SomeClass: TSomeClass);
    destructor Destroy; override;
  end;

...

constructor TSomeWrapper.Create(_SomeClass: TSomeClass);
begin
  inherited Create;
  fSomeClass := _SomeClass;
end;

destructor TSomeWrapper.Destroy;
begin
  fSomeClass.Free;
  inherited;
end;
Benutzt wird dieses Objekt wie folgt:

Delphi-Quellcode:
var
  SomeInt: ISomeInterface;
...
  SomeInt := TSomeWmapper.Create(TSomeClass.Create);
  SomeInt.Method1;
...
Man erzeugt also eine Instanz von TSomeWrapper, übergibt ihr eine ebenfalls frisch erzeugte Instanz von TSomeClass, und verwendet sie als ob es sich um eine auf magische Weise auch von TInterfacedObject abgeleitete Version von TSomeClass handelte, weist sie z.B. auf eine Variable vom Typ ISomeInterface zu. Reference-Counting natürlich inklusive.
http://www.dummzeuch.de/delphi/objec...%20L%C3%B6sung

Hey Dumuzeuch,

das ist ja echt schon ewig her. Da sieht man mal was es alles aufzuholen gilt
Deine Lösung gefällt mir gut, ich versuch mal mein Glück. Danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 16:13
Jupp, ableiten.
Dann bleibt nur noch der Wrapper drumrum.

Viele Klassen haben zwar bereits ein "Interface" drin (z.B. alles was von TPersistent/TComponent abgeleitet ist),
aber das, was du wissen willst, würde dort wohl fehlen.
$2B or not $2B
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#7

AW: Interface aus bestehenden Klassen erstellen

  Alt 19. Mai 2023, 17:37
Hi in die Runde,


Zukünfitg will ich meine Enwticklungen immer mit unit Tests ausstatten. Dafür muss ich zukünftig zwangsläufig mit interfaces arbeiten.
Wieso? Mit DUnit kann man Testcases für Klassen, Interfaces, standalone Procedures etc. erstellen. Test-driven Deverlopment ist in keiner Weise an die Verwendung von Interfaces gekoppelt.
Peter Below
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#8

AW: Interface aus bestehenden Klassen erstellen

  Alt 20. Mai 2023, 22:57
Hallo,

ja, es ist nicht daran gekoppelt. Aber wenn man Dinge Mocken können will oder so,
dann ist es sicher praktischer wenn sich die Unit Tests auf ein Interface beziehen.
Schlage vor, du liest mal Nick Hodges' Bücher, dann merkst du auf was der OP hinaus
will...

Grüße
TurboMagic
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Interface aus bestehenden Klassen erstellen

  Alt 22. Mai 2023, 13:06
ich bin schon seit einiger Zeit Delphi entwickler und möchste meine Fähigkeiten in der Programmierung verbessern und erweitern. Lese aktuell die Bücher von Nick Hodges, kann ich auf diesem weg nur empfehlen.
Zukünfitg will ich meine Enwticklungen immer mit unit Tests ausstatten.


Ich hoffe die Frage ist nicht zu Kindergarten, ...
Leider Ja. Ich wünschte es wäre bei Delphi-Entwickler normal dass man e sso macht. Außerhalb Delphi ist eine solche Programmierweise schon lange bekannt. (https://clean-code-developer.de)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#10

AW: Interface aus bestehenden Klassen erstellen

  Alt 22. Mai 2023, 13:16
Hilfreich wäre es aber auch, wenn die IDE eine Liste aller Klassen im Projekt, die ein bestimmtes Interface implementieren, ausspucken könnte
und von dort könnte man gleich zur passenden Klassendeklaration springen...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 18:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz